我在尝试支持取消文件上传时遇到问题。我想知道确定上传是否可取消的最佳做法。那么如何确定文件何时完成上传,而不是服务器生成/返回响应?我知道这可以通过跟踪 HTML5 中的文件进度来实现,但是由于我必须支持 IE9,所以我的想法已经不多了。
最终结果是,如果您尝试取消即将完全上传的文件上传,并发出中止请求,您最终会中止响应并且文件愉快地位于服务器上。
我正在使用 jquery 提交请求,并通过 abort() 方法取消。我在浏览器控制台中看到请求已成功中止。
我错过了一些微不足道的事情吗?
PHP 现在可以跟踪上传进度。请参阅“会话上传进度”。
使用此功能编写一个简短的脚本:checkUpload.php
,并使用 AJAX 将状态返回到您的 IE9 页面。
<?php
$_SESSION["upload_progress_123"] = array(
"start_time" => 1234567890, // The request time
"content_length" => 57343257, // POST content length
"bytes_processed" => 453489, // Amount of bytes received and processed
"done" => false, // true when the POST handler has finished, successfully or not
"files" => array(
0 => array(
"field_name" => "file1", // Name of the <input/> field
// The following 3 elements equals those in $_FILES
"name" => "foo.avi",
"tmp_name" => "/tmp/phpxxxxxx",
"error" => 0,
"done" => true, // True when the POST handler has finished handling this file
"start_time" => 1234567890, // When this file has started to be processed
"bytes_processed" => 57343250, // Number of bytes received and processed for this file
),
// An other file, not finished uploading, in the same request
1 => array(
"field_name" => "file2",
"name" => "bar.avi",
"tmp_name" => NULL,
"error" => 0,
"done" => false,
"start_time" => 1234567899,
"bytes_processed" => 54554,
),
)
);
使用 PHP,现在也可以取消上传过程。从上面引用的同一手册页中,出现以下文本:
也可以通过将 $_SESSION[$key]["cancel_upload"] 键设置为 TRUE 来取消当前正在进行的文件上传。当在同一个请求中上传多个文件时,这只会取消当前正在进行的文件上传和待处理的文件上传,但不会删除成功完成的上传。当像这样取消上传时,$_FILES 数组中的错误键将设置为 UPLOAD_ERR_EXTENSION。
PHP 文档中唯一没有涉及的是如何获取总文件大小。这里有一个很好的回顾这个过程:“PHP Master | Tracking Upload Progress”