我一直在嘗試創建一個非Flash上傳面板,它也顯示一個進度條。 在我們的服務器上我們有PHP 5.3(現在不能升級到5.4,所以新的上傳進度功能不能使用=>http://php.net/manual/en/session.upload-progress.php)。 我們不能使用基於閃存的解決方案,擴展或類似的。基於AJAX/PHP的大文件進度條上傳
因此,我一直在使用一個XMLHttpRequest與AJAX結合審判。 這裏的問題是我只取得了部分成功。
我設法上傳並保存在服務器上一個大約380 MB的文件,但是,當使用像4 GB這樣的大文件進行嘗試時,它不會被保存在服務器上(如果我用Firebug檢查有一點會說「POST中止」)。
另一個奇怪的事情是,用相同的文件xhr.upload.loaded與xhr.upload.total相同尺寸開始,並開始從那裏計數。
有誰知道如何解決這個問題,或者有一個替代的解決方案?
的客戶端代碼:
<script type="application/javascript" src="jquery.js"></script>
<script type="application/javascript">
function uploadToServer()
{
fileField = document.getElementById("uploadedFile");
var fileToUpload = fileField.files[0];
var xhr = new XMLHttpRequest();
var uploadStatus = xhr.upload;
uploadStatus.addEventListener("progress", function (ev) {
if (ev.lengthComputable) {
$("#uploadPercentage").html((ev.loaded/ev.total) * 100 + "%");
}
}, false);
uploadStatus.addEventListener("error", function (ev) {$("#error").html(ev)}, false);
uploadStatus.addEventListener("load", function (ev) {$("#error").html("APPOSTO!")}, false);
xhr.open(
"POST",
"serverUpload.php",
true
);
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.setRequestHeader("X-File-Name", fileToUpload.fileName);
xhr.setRequestHeader("X-File-Size", fileToUpload.fileSize);
xhr.setRequestHeader("X-File-Type", fileToUpload.type);
//xhr.setRequestHeader("Content-Type", "application/octet-stream");
xhr.send(fileToUpload);
}
$(function(){
$("#uploadButton").click(uploadToServer);
});
</script>
HTML部分:
<form action="" name="uploadForm" method="post" enctype="multipart/form-data">
<input id="uploadedFile" name="fileField" type="file" multiple />
<input id="uploadButton" type="button" value="Upload!">
</form>
<div id="uploadPercentage"></div>
<div id="error"></div>
服務器端代碼:
<?php
$path = "./";
$filename = $_SERVER['HTTP_X_FILE_NAME'];
$filesize = $_SERVER['CONTENT_LENGTH'];
$file = "log.txt";
$fo= fopen($file, "w");
fwrite($fo, $path . PHP_EOL);
fwrite($fo, $filename . PHP_EOL);
fwrite($fo, $filesize . PHP_EOL);
fwrite($fo, $path . $filename . PHP_EOL);
file_put_contents($path . $filename,
file_get_contents('php://input')
);
?>
查找找** max_upload_file_size ** ** max_post_size **和相關的標誌上傳/文件大小上傳。 – 2012-04-20 19:39:18
我已經檢查過這些,一切似乎都很好。 – DiG 2012-04-20 21:39:03
這聽起來像是一個笑話,但有時候人們會做一些愚蠢的事情,所以我反過來問:「你使用FAT32作爲文件系統嗎?」 – 2013-08-29 12:01:40