プログレスバーも表示する非フラッシュアップロードパネルを作成しようとしています。 私たちのサーバーにはPHP 5.3があります(現在は5.4にアップグレードすることはできませんので、新しいアップロードの進行状況を使用することはできません>http://php.net/manual/en/session.upload-progress.php)。 Flashベースのソリューション、拡張機能などは使用できません。AJAX/PHPベースの大容量ファイル用プログレスバー付きアップロード
したがって、AJAXと組み合わせたXMLHttpRequestを使用しようとしました。 ここでの問題は、私が部分的に成功したことだけです。
サーバー上に約380 MBのファイルをアップロードして保存することができましたが、4 GBなどの大きなファイルを使用しようとするとサーバーに保存されません(Firebugで1ポイントは "POST aborted"と表示されます)。
もう1つの奇妙なことは、同じファイルでは、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_post_size **と投稿サイズ/ファイルサイズに関する関連フラグ。 –
私はすでにそれらをチェックして、すべてがうまく見えます。 – DiG
それは冗談のように聞こえるが、時には愚かなことがあるので、私はとにかく尋ねる。「FAT32をファイルシステムとして使用していますか? –