首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >口吻6大文件上传/春景

口吻6大文件上传/春景
EN

Stack Overflow用户
提问于 2017-08-11 17:47:57
回答 2查看 2.5K关注 0票数 0

我读过,如果口香糖不能确定内容长度,它将发送传输编码:分块头和后端的cURL将处理分块。但我显然达到了post_max_size的极限。(“发布内容长度超过了8388608字节的限制)当POSTing发送到一个工作的uploadChunkerController时。我知道上传处理程序(端点)可以处理较小的文件。我觉得我的口香糖选项配置有问题。我必须将verify设置为false,我需要在请求中发布一个api_key

代码语言:javascript
复制
    $client = new Client();
    $fh     = fopen('../storage/random-500M.pdf', 'r');
    $url    = 'https://local:8443/app_dev.php/_uploader/bigupload/upload';

    $request = $client->request(
        'POST',
        $url,
        [
            'verify'    => false,
            'multipart' => [
                [
                    'name' => 'api_key',
                    'contents' => 'abc123'
                ],
                [
                    'name'     => 'file',
                    'contents' => $fh,
                    'filename' => 'bigupload.pdf'
                ]
            ]
        ]
    );

编辑php.ini设置既不是选项,也不是解决方案。我已经找到了许多“解决方案”,似乎是针对较老版本的口香糖。我是不是想得太紧了?有更简单的解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-15 16:27:51

在挖掘了口香糖和cURL源代码之后,他们没有“自动”的方式来发送“块”。头文件没有设置,也没有办法分割正在发送的文件。我已经想出了自己的解决方案,使用的是Guzzle原始的PHP cURL调用。

代码语言:javascript
复制
/**
 * @Route("/chunks", name="chunks")
 */
public function sendFileAction()
{
    $jar       = new \GuzzleHttp\Cookie\SessionCookieJar('SESSION_STORAGE', true);
    $handler   = new CurlHandler();
    $stack     = HandlerStack::create($handler);
    $client    = new Client(['cookies'=>true, 'handler' => $stack]);
    $filename  = 'files/huge-1gig-file.jpg';
    $filesize  = filesize($filename);
    $fh        = fopen($filename, 'r');
    $chunkSize = 1024 * 2000;
    $boundary  = '----iCEBrkUploaderBoundary' . uniqid();
    $url       = 'https://localhost/app_dev.php/_uploader/bigupload/upload';

    rewind($fh); // probably not necessary
    while (! feof($fh)) {
        $pos   = ftell($fh);
        $chunk = fread($fh, $chunkSize);
        $calc  = $pos + strlen($chunk)-1;

        // Not sure if this is needed.
        //if (ftell($fh) > $chunkSize) {
        //    $pos++;
        //}

        $request = $client->request(
            'POST',
            $url,
            [
                'cookies' => $jar,
                'debug'   => false,
                'verify'  => false,
                'headers' => [
                    'Transfer-Encoding'   => 'chunked',
                    'Accept-Encoding'     => 'gzip, deflate, br',
                    'Accept'              => 'application/json, text/javascript, */*; q=0.01',
                    'Connection'          => 'keep-alive',
                    'Content-disposition' => 'attachment; filename="' . basename($filename) . '"',
                    'Content-length'      => $calc - $pos,
                    'Content-Range'       => 'bytes ' . $pos . '-' . $calc . '/' . $filesize
                ],
                'multipart' => [
                    [
                        'name'     => 'api_key,
                        'contents' => 'aaabbbcc-deff-ffed-dddd-1234567890123'
                    ],
                    [
                        'name'     => 'file',
                        'contents' => $chunk,
                        'filename' => basename($filename),
                        'headers' => [
                            'Content-Type' => 'multipart/form-data; boundary=' . $boundary
                        ]
                    ]
                ]
            ]
        );
    }

    return new Response('ok', 200);
}

我希望这能帮到别人。欢迎提出意见/建议。

票数 4
EN

Stack Overflow用户

发布于 2017-08-12 09:56:38

分块传输编码在这种情况下没有帮助。

它用于通过发送(并按部分)生成内容来尽快提供内容。它与大小限制无关(就像在您的场景中那样)。

对您来说,唯一的方法是增加服务器的限制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45641050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档