为什么我的文件数据在传输中丢失了?

时间:2013-04-03 11:32:38

标签: javascript upload xmlhttprequest

好的,所以我发现这种方法可以从不同的问题上传大文件:

function sliceit(file)
{
    fr = new FileReader;
    chunkSize = 1000000;            

    chunks = Math.ceil(file.size / chunkSize);
    chunk = 0;
    var isstart = true;

    function loadNext() {
        start, end,
        start = chunk * chunkSize;
        if (start > file.size)
            start = end+1;
        end = start + (chunkSize -1) >= file.size ? file.size : start + (chunkSize -1);
        fr.onloadend = function(e)
        {
            while(!fr.result || fr.result == "" || fr.result == undefined)
            {
            }
            fdata = fr.result;
            xmlhttp, form, data;
            data = {};
            data.filename = document.getElementById("filename0").value;
            data.username = document.getElementById("username").value;
            data.password = document.getElementById("password").value;
            data.public = document.getElementById("public").value;
            if(isstart)
            {
                var form = new FormData();
                form.append("filename", data.filename);
                form.append("username", data.username);
                form.append("password", data.password);
                form.append("public", data.public);
                form.append("filebytes", fdata);
                xmlhttp = jQuery.ajaxSettings.xhr();
                xmlhttp.open("POST", "../MakeEmptyFile.php", false);
                isstart = false;
            }
            else
            {
                form = new FormData();
                form.append("filename", data.filename);
                form.append("username", data.username);
                form.append("password", data.password);
                form.append("filebytes", fdata);
                xmlhttp = jQuery.ajaxSettings.xhr();
                xmlhttp.open("POST", "../AddTo.php", false);
            }
            xmlhttp.send(form);
            console.log(xmlhttp.responseText);
            if (++chunk <= chunks)
            {
                loadNext();
            }
            else
            {
                stdlog("Completed.");
            }
        };
        fr.readAsText(file.slice(start, end));

    }
    loadNext();
}

出于某种原因,每次加载XMLHttpRequest时,都会显示文件数据从未实际发送过。这是因为它太大了,还是什么?谢谢!

1 个答案:

答案 0 :(得分:0)

听起来你缺少一些与File API相关的基本概念。我的答案来自你的问题的评论。

首先,以块为单位上传文件的正确方法是在BlobFile对象上使用the slice methodslice方法将始终返回另一个Blob。此Blob代表您已雕刻的BlobFile部分。然后,您可以append Blob到您的FormData对象。您的FormData对象将以多部分编码的POST请求发送。 Blob将作为表单字段在请求中的一个多部分边界内表示,就像您附加到FormData对象的任何其他参数一样。

服务器端,您将读取此Blob,就像在解析MPE请求时读取任何其他文件一样。这个Blob需要临时存储在服务器端,以及构成完整文件的任何其他Blob。收到所有部件后,您需要按照服务器端的正确顺序组装它们。

您当前的方法涉及将文件切片为blob,读取blob的全部内容,然后将内容附加到FormData对象。这对我来说似乎多余而且效率低下。