上传 30 秒后,使用 PHP 上传 Dropzone.js 失败

     2023-02-24     113

关键词:

【中文标题】上传 30 秒后,使用 PHP 上传 Dropzone.js 失败【英文标题】:Dropzone.js upload with PHP failed after 30 seconds upload 【发布时间】:2018-03-04 22:19:45 【问题描述】:

我正在尝试将“大”文件上传到我的应用程序。用户必须能够上传小于 200MB 的视频文件,但似乎服务器在 4MB 或 30 秒后断开连接并且上传失败。

我已经将php.inifile 中的所有参数设置为:

max_input_time = 320max_execution_time = 320max_file_uploads = 20memory_limit = 512Mpost_max_size = 201Mupload_max_filesize = 200M

当我上传 2MB @ 1Mbps/s 的文件时一切正常(我不知道是文件大小还是传输时间的问题)

可以在 php_info 访问实时 php_info() 文件

虽然这里是 DropZone.js conf:

$("#dZUpload").dropzone(
     url: "/ajax/admin/admin.acceptVideo.php",
     maxFilesize: 209715200,
     acceptedFiles: "video/*",
     addRemoveLinks: true,
     dataType: "HTML",
     data:  id: '' ,
     success: function (file, response, data) 
         var imgName = response;
         file.previewElement.classList.add("dz-success");
         $('#form_video').val(imgName);
     ,
     error: function (file, response) 
     file.previewElement.classList.add("dz-error");
     
);
Dropzone.autoDiscover = false;
Dropzone.prototype.defaultOptions.dictRemoveFile = "Rimuovi file";
Dropzone.prototype.defaultOptions.dictCancelUpload = "Annulla";

这是处理上传的 PHP 脚本:

<?php
require_once '../db.config.php';

header('Content-Type: text/plain; charset=utf-8');

ini_set('upload_max_filesize', '200M');
ini_set('post_max_size', '201M');
ini_set('max_input_time', 320);
ini_set('memory_limit', '256M'); 


try 
    if (
        !isset($_FILES['file']['error']) ||
        is_array($_FILES['file']['error'])
    ) 
        throw new RuntimeException('Invalid parameters.');
    

    switch ($_FILES['file']['error']) 
    case UPLOAD_ERR_OK:
        break;
    case UPLOAD_ERR_NO_FILE:
        throw new RuntimeException('No file sent.');
        break;
    case UPLOAD_ERR_INI_SIZE:
        break;
    case UPLOAD_ERR_FORM_SIZE:
        throw new RuntimeException('Exceeded filesize limit.');
        break;
    default:
        throw new RuntimeException('Unknown errors.');
        break;


    // check filesize. 
    if ($_FILES['file']['size'] > 209715200) 
        throw new RuntimeException('Exceeded filesize limit.');
    

    // Check MIME Type.
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    if (false === $ext = array_search(
            $finfo->file($_FILES['file']['tmp_name']),
            array(
                'mp4' => 'video/mp4',
                'mov' => 'video/mov',
                'avi' => 'video/avi',
            ),
            true
        )) 
        throw new RuntimeException('Invalid file format.');
    

    // name uniquely.
    $fileName = sha1_file($_FILES['file']['tmp_name']);
    if (!move_uploaded_file($_FILES['file']['tmp_name'], sprintf('/var/www/html/beta.vedocompro.it/web/webtemp/%s.%s', $fileName, $ext ))) 
        throw new RuntimeException('Failed to move uploaded file.');
    

    try 

        $PDO = new PDO('mysql:host=' . $DB_HOST . ';dbname=' . $DB_NAME,$DB_USER,$DB_PASS);
        $insert = $PDO->prepare("INSERT INTO `videos` (`id`, `aid`, `accepted`, `uid`, `dir`) VALUES (NULL, '0', '0', '0', $fileName);");
        $insert->execute();

        echo $fileName;

     catch(PDOException $exception) 
        echo $exception;
    



 catch (RuntimeException $e) 

    echo $e->getMessage();


所以一切似乎都正常,但服务器在出现问题后断开连接(我认为与PDOquery 无关,因为较小的 2MB 文件可以工作)。

您能帮忙找出问题吗?

编辑做一些测试,我发现脚本正好在执行 30 秒时下降,我尝试在脚本顶部添加 set_time_limit(0);,但没有任何改变

【问题讨论】:

好吧,您的一些案例缺少休息时间。这可能无法修复您的代码,但您需要添加它们。 “我认为与 PDOquery 无关” - 可能是,您的 VALUES (NULL, '0', '0', '0', $fileName) 文件名很可能是一个字符串并且可能会失败,但我可以不过是错的。 您可以编辑您的帖子以使其包含相应的 html 吗?也许那里有一些包含限制的东西。如果您在本地服务器上运行此程序,请确保在进行这些更改后重新启动所有服务(如果您确实进行了任何更改)。将最大执行时间也设置为 0。 @Fred-ii- PDOquery 不影响上传原因将在此之后执行,我知道它失败了,但是可以上传较小的文件。我可以为此粘贴生成的 HTML,但它是 Dropzone.js 的默认 HTML @ßiansorÅ.Ålmerol 正如我在答案中写过两次,错误是 PHP 在大约 4MB 上传或未定义时间后断开连接。无论如何,问题可能与拒绝文件的 Drozone.js 有关 【参考方案1】:

问题在于 XHR 超时涉及 ajax 调用配置。

为避免这种情况,必须将timeout: 180000(或您想要的毫秒数)放入DropZone.js init 参数中。

$("#dZUpload").dropzone(
     url: "/ajax/admin/admin.acceptVideo.php",
     maxFilesize: 209715200,
     acceptedFiles: "video/*",
     addRemoveLinks: true,
     dataType: "HTML",
     timeout: 180000,
     success: function (file, response, data) 
         // Do things on Success
     ,
     error: function (file, response) 
     file.previewElement.classList.add("dz-error");
     
);

这不会在使用DropZone.js 上传文件时导致30 seconds 超时。

更新

正如@Brendon Muir 报告的那样,您还可以将0 插入为timeout 以禁用超时。

DropZone.js 文档报告默认超时为 0,这是不正确的,默认超时为 30 秒。 值为 0 将禁用超时。

【讨论】:

Web 服务器级别的设置也可能会影响超时行为。这个帮助了我:***.com/questions/24127601/… 您也可以将超时设置为 0 以禁用超时。它在文档中默认错误地报告为 0,但实际上默认设置为 30 秒。 感谢您的建议@BrendonMuir,我已经更新了我的回复。 谢谢伙计,这正在工作我必须使用 0 以防上传更大的文件。 遇到了同样的问题,你的回答想出了解决方案【参考方案2】:

我意识到这个问题有点老了,但是我在捕捉超时行为方面遇到了问题,并发现了这个解决方案,而不是在发送函数上捕捉到超时,如下所示:

$("#dZUpload").dropzone(
     url: "/ajax/admin/admin.acceptVideo.php",
     maxFilesize: 209715200,
     acceptedFiles: "video/*",
     addRemoveLinks: true,
     dataType: "HTML",
     data:  id: '' ,
     success: function (file, response, data) 
         var imgName = response;
         file.previewElement.classList.add("dz-success");
         $('#form_video').val(imgName);
     ,
     error: function (file, response) 
         file.previewElement.classList.add("dz-error");
     ,
     //Called just before each file is sent
     sending: function(file, xhr, formData) 
         //Execute on case of timeout only
         xhr.ontimeout = function(e) 
             //Output timeout error message here
             console.log('Server Timeout');

         ;
     
);

【讨论】:

非常正确!对我来说,超时永远不会被错误回调捕获!虽然看起来像一个错误 我添加了发送: - 没有变化 - 只是服务器响应 0 代码。

无法使用 $ajax() 在 PHP 中上传文件

】无法使用$ajax()在PHP中上传文件【英文标题】:Can\'tuploadfileinPHPusing$ajax()【发布时间】:2020-03-1403:45:30【问题描述】:我试图使用带有jQ​​uery的ajax()函数的php在服务器上上传文件。下面是我正在尝试的代码。当我在没有jQuery... 查看详情

使用 FormData 上传 PHP AJAX 图像

】使用FormData上传PHPAJAX图像【英文标题】:PHPAJAXImageUploadingwithFormData【发布时间】:2015-04-2301:32:30【问题描述】:我对jQuery和Ajax函数比较陌生,但过去几天一直在使用Ajax表单。但是在尝试上传图像时,我遇到了文件上传问题。... 查看详情

上传图片超时

】上传图片超时【英文标题】:Timeoutwhenuploadingimages【发布时间】:2012-11-1323:26:22【问题描述】:我目前正在测试Tridion2011,但在创建包含上传内容的多媒体组件(而不是外部)时遇到问题。我填写标题、架构、多媒体类型,从... 查看详情

HP ALM 11 使用 PHP 和 cURL 上传附件

】HPALM11使用PHP和cURL上传附件【英文标题】:HPALM11UploadattachmentusingPHPandcURL【发布时间】:2013-03-2419:30:34【问题描述】:我需要将附件上传到HPALM11中的测试。为此,我创建了一个基于cURL的自定义PHP函数以使用ALM的RESTAPI。这是代... 查看详情

PHP - 使用正确的 MIME 类型打开上传的 DOCX 文件

】PHP-使用正确的MIME类型打开上传的DOCX文件【英文标题】:PHP-OpeninguploadedDOCXfileswiththecorrectMIMETYPE【发布时间】:2011-01-1717:38:30【问题描述】:我有用户上传我提供下载的DOCX文件。我们遇到的问题是DOCX文件的未知mime类型导致IE... 查看详情

如何使用 .htaccess 或 php.ini 增加上传文件大小限制? [复制]

】如何使用.htaccess或php.ini增加上传文件大小限制?[复制]【英文标题】:Howtoincreasetheuploadfilesizelimitusing.htaccessorphp.ini?[duplicate]【发布时间】:2017-08-2015:46:30【问题描述】:一开始我无法将超过2Mb的文件上传到服务器。编辑.htacces... 查看详情

从手机上传时图像旋转 90 度? PHP

】从手机上传时图像旋转90度?PHP【英文标题】:Imagerotating90degreeswhenuploadedfrommobile?PHP【发布时间】:2015-11-2304:30:19【问题描述】:我有一个网站,用户可以从手机上传照片,但所有从手机上传的照片在上传时都向左显示90度。... 查看详情

为啥我不能下载用 PHP 上传的文件?

】为啥我不能下载用PHP上传的文件?【英文标题】:Whycan\'tIdownloadfilesuploadedwithPHP?为什么我不能下载用PHP上传的文件?【发布时间】:2011-09-1304:30:07【问题描述】:我已经使用PHP创建了一个自定义CMS,它会将文件上传到具有777权... 查看详情

如何在php中允许有限大小的文件上传?

】如何在php中允许有限大小的文件上传?【英文标题】:Howtoallowlimitedsizefileuploadinphp?【发布时间】:2014-09-1118:49:53【问题描述】:我有一个网站托管在我无法访问的PC上。我有一个上传表单,允许人们上传最大30MB的文件。我的... 查看详情

使用 html5 分块上传文件

】使用html5分块上传文件【英文标题】:uploadingafileinchunksusinghtml5【发布时间】:2011-12-1219:11:30【问题描述】:我正在尝试使用html5的文件API分块上传文件,然后在php.ini的服务器端重新组装它。我正在上传视频,但是当我在服务... 查看详情

使用 PHP 上传多个文件 [重复]

】使用PHP上传多个文件[重复]【英文标题】:MultipleFileUploadwithPHP[duplicate]【发布时间】:2017-02-2823:24:47【问题描述】:我想上传多个文件上传。它几乎和简单一样文件上传,但我们需要使用html标记和php代码。需要在html标记上添... 查看详情

使用日语文件名的 PHP 文件上传在数据库中变成损坏的文件名

】使用日语文件名的PHP文件上传在数据库中变成损坏的文件名【英文标题】:PHPfileuploadwithjapanesefilenameturnsintocorruptedfilenameinDB【发布时间】:2022-01-0717:22:30【问题描述】:我有一个RESTAPI端点,可让您将文件上传到服务器。当我... 查看详情

Youtube 上传 api 套接字超时

】Youtube上传api套接字超时【英文标题】:Youtubeuploadapisockettimesout【发布时间】:2021-09-0902:45:24【问题描述】:所以我有一个简单的测试脚本,我试图将一个6秒的mp4视频上传到我的频道。我已经在谷歌云中配置了所有内容,并且... 查看详情

使用php上传1GB文件

】使用php上传1GB文件【英文标题】:1GBfileuploadusingphp【发布时间】:2011-04-1916:22:15【问题描述】:我正在尝试使用php脚本上传1GB大小的文件,如果文件大小小于20MB,它可以正常工作,但是当我增加文件大小而不是在网站上按下... 查看详情

如何使用 shieldUI 上传器和 php 实际上传和删除文件?

】如何使用shieldUI上传器和php实际上传和删除文件?【英文标题】:HowdoIactuallyuploadandremovefilesusingtheshieldUIuploaderandphp?【发布时间】:2019-01-2318:40:15【问题描述】:我正在尝试为网站制作附件模块。这是附件控制器脚本Attachments.ph... 查看详情

在使用 PHP 上传之前调整照片大小

】在使用PHP上传之前调整照片大小【英文标题】:ResizingphotobeforeuploadwithPHP【发布时间】:2015-07-2407:01:06【问题描述】:我目前正在使用Valums-File-Uploader将文件上传到我的服务器。该插件使用javascript加载图像并使用php保存它们。... 查看详情

Angularjs - 使用 php 上传文件

】Angularjs-使用php上传文件【英文标题】:Angularjs-Fileuploadwithphp【发布时间】:2013-12-2712:59:49【问题描述】:我花了几天时间寻找一个相当简单的angularjs文件上传方法集成,其中包括一个基本的php服务器端脚本..我需要一个简单的... 查看详情

如何设置php上传文件大小限制

修改PHP上传文件大小限制的方法1.一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.但在php中,默认的该页最久执行时间为30秒.就是说超过30秒,该脚本就停止执行.这就导致出现无法打开网页的情况.... 查看详情