如何通过ajax上传文件而不会超时?

Posted

技术标签:

【中文标题】如何通过ajax上传文件而不会超时?【英文标题】:How to upload files via ajax without timeouts? 【发布时间】:2019-09-22 13:37:45 【问题描述】:

我正在使用 ajax 上传一组约 50 个文件,全部

在 Firefox 中,ajax 将失败并返回“错误”响应,但没有更多信息。 在 Chrome 中,我收到 net::ERR_CONNECTION_RESET 错误。

我检查了我的 Apache 和 php.ini 设置,我相信它们都足够了。

post_max_size = 1000M
upload_max_filesize = 15M
max_input_time = -1
max_execution_time = 0
max_file_uploads = 50
memory_limit = 128M

我也尝试将 ajax 的超时参数设置为 0。我的 ajax 请求看起来像这样:

return $.ajax( 
    url: ajaxpath,
    type: 'post',
    data: formData,
    dataType: 'json',
    timeout: 0,
    xhr: function()

        var myXhr = $.ajaxSettings.xhr();

        if(myXhr.upload) myXhr.upload.addEventListener('progress',function(e)

            uploadProgress(e,item);

        ,false);

        return myXhr;

    ,
    processData: false,
    contentType: false

).fail(function(jqXHR,textStatus,errorThrown)

            console.log(textStatus,errorThrown);

        );

    

有了更快的连接,我似乎没有遇到这个问题。如果我使用浏览器的开发者工具来限制速度,它就会发生,这就是我正在复制我的用户的情况。

我是否在某处缺少设置?如何让上传保持有效?

【问题讨论】:

【参考方案1】:

使用mod_reqtimeout Apache 模块最终解决了我的问题:

RequestReadTimeout header = 20-40, MinRate = 500 body = 20, MinRate = 500

我在a similar question底部找到了这个建议。

作为参考,我尝试增加各种 ini 设置、Apache TimeOut 指令以及 set_time_limit php 函数,但没有成功。

【讨论】:

【参考方案2】:

首先,您的 Web 服务器可能有其他超时配置,这也可能会中断 PHP 执行。

Apache 有一个 Timeout 指令,而 IIS 有一个 CGI 超时功能。

两者都默认为 300 秒。

请参阅您的网络服务器文档以了解具体细节。

这条消息

ERR_CONNECTION_RESET

不是来自 php 脚本,这是服务器问题,因为服务器正在断开向客户端发送任何内容!

您可以在这里尝试:

1- 更改设置 max_execution_time = 1000 并查看是否有更多时间,我在使用 max_execution_time = 0 时遇到了旧 xammp 和 appserv 版本的一些问题!

2- 在 php.ini 中设置:

upload_max_filesize = 300M

post_max_size = 300M

3- 将其放入您的脚本中:

set_time_limit(3600); // 1 hour

由于上传在快速连接上工作正常,我猜问题是某处超时

【讨论】:

【参考方案3】:

您的配置似乎正确。只缺少一件事,即 set_time_limit

set_time_limit(0); //If set to zero, no time limit is imposed. 

【讨论】:

以上是关于如何通过ajax上传文件而不会超时?的主要内容,如果未能解决你的问题,请参考以下文章

ajax如何 实现 文件上传

您如何通过 FTP 上传核心 PHP 文件而不会中断您网站的访问者

如何通过 Jquery/AJAX 上传文件 [重复]

如何通过拖放上传多个文件并使用ajax浏览

AJAX多文件上传

Rails 4:如何使用 AJAX 上传文件