现在的困难
工作中,经常碰到大文件上传的需求,如上传大的用户包、CDK列表等。常规的解决方案是采用form表单+iframe方式提交给php处理,如下面的代码:
//html
<form enctype="multipart/form-data" target="hidden_target"
action="CRobFloor.php?a=Upload" method="POST"
id="frmImportCDK">
<label class="col-lg-3">请选择CDK文件</label>
<input type="file" name="sCDKFile" require="true" datatype="require" msg="请选择文件" id="tFileUpload"/>
<button type="submit" id="btnUpload">上传</button>
</form>
<iframe name="hidden_target" id="hidden_target" src="about:blank" style="display:none;"></iframe>
//php
if (is_uploaded_file($_FILES["sCDKFile"]["tmp_name"])) {
switch ($_FILES["sCDKFile"]["error"]) {
case UPLOAD_ERR_OK:
break;
case UPLOAD_ERR_NO_FILE:
$this->OutputScript('No file sent.');
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
$this->OutputScript('Exceeded filesize limit.');
default:
$this->OutputScript('Unknown errors. Code:' . $_FILES["sCDKFile"]["error"]);
}
//上传文件的类型
$stype = $_FILES["sCDKFile"]["type"];
//如果文件符合要求并且上传过程中没有错误
if ($stype != "text/plain" && $stype != "application/csv") {
$this->OutputScript("请选择上传txt,csv格式的文件,不支持格式{$stype}");
}
....
上面方案存在一个致命的问题,没发处理大文件的上传。主要受到来自下面几个方面的限制:
- PHP的脚本时长的限制
- 长时间上传,网络中断的问题
- PHP脚本执行时内存大小等的限制
- apache服务器链接数限制
与之相关的php配置项如下: