3

私は現在、進行状況などを含む非常に大きなファイル(サーバーが許可するよりも大きい)のアップロードモジュールを開発しています。以下のコードを参照してください。テキストファイル、画像、さらにはドキュメントやPDFファイルでも機能します。他のファイルタイプではクラッシュします。誰か提案がありますか?

var fr = new FileReader;
chunkSize = 524288;
//chunkSize = window.maxPost;
var chunks = Math.ceil(file.size / chunkSize);
var chunk = 0;
function SendSlice() {
    var start, end;
    start = chunk * chunkSize;
    if (start > file.size) {
        start = end + 1;
    }
    end = start + (chunkSize - 1) >= file.size ? file.size : start + (chunkSize - 1);
    status = chunk == 0 ? "start" : (chunk == chunks ? "end" : "progress");
    if (status == 'start') {
            $("#upload-area").append("<p>Upload started for file " + file.name + "</p>");
    }
    fr.onload = function(e) {
        var sliceData = e.target.result;
        $.ajax({
            type : "POST",
        url : "uploader.php",
        data : {
            filename : file.name,
            status : status,
            slice : sliceData
        }
        }).success(function(data) {
            if (++chunk <= chunks) {
                SendSlice();
                var progress = (chunk / chunks) * 100;
                $("#progress-text").html(progress.toFixed(2) + "%");
                $("#progress").css({
                    width : progress + "%"
                });
            } else {
                $("#upload-area").append("<p>File " + file.name + " uploaded succesfully. Download file <a target='_blank' href='uploads/" + file.name + "'>here</a></p>");
            }
        });
    };
    fr.readAsDataURL(file.slice(start, end));
}
SendSlice();

そしてphpコード:

 if($_POST['status'] == 'start') {
if (file_exists("uploads/" . $_POST['filename'])) {
    unlink("uploads/" . $_POST['filename']);
}
 }
 $data = explode(",", $_POST['slice']);
 $data = $data[1];
 $data = base64_decode($data);
 file_put_contents("uploads/" . $_POST['filename'], $data, FILE_APPEND);

また、readAsBinaryStringを使用してみましたが、PHPで結果を処理する方法がわかりません。ご意見をお聞かせください

4

1 に答える 1

4

これは暗闇の中でのショットですが、file.slice API(http://www.w3.org/TR/FileAPI/#dfn-slice)を見ると、次のようになっています。

「sliceメソッドは、オプションの開始パラメーターからオプションの終了パラメーターまでの範囲のバイトと、オプションのcontentTypeパラメーターの値であるtype属性を持つ新しいBlobオブジェクトを返します。」

ただし、使用する前に「終了」から1を減算します。つまり、それぞれ1バイトを省略しますchunk(終了バイトは含まれていないため)。

また、使用する前に消毒$_POST['filename']します-誰かがそこに入れる"../yourscript.php"のではありませんか?

于 2013-02-14T14:42:55.930 に答える