【问题标题】:Problem with HTML5 XHR FileUpload and ASP.NetHTML5 XHR FileUpload 和 ASP.Net 的问题
【发布时间】:2011-11-05 11:34:04
【问题描述】:

我正在尝试使用 HTML5 的 XMLHttpRequest 上传文件。

这是我的代码:

var xhr = new XMLHttpRequest();
xhr.open("POST", "receive.aspx", true);
//xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.setRequestHeader("Content-Type", "application/octet-stream");
xhr.send($("#fileobject").files[0]);

在服务器端,我得到0Request.Files.Count。但是,如果我读取输入流,我会得到文件的标题,如下所示:

------WebKitFormBoundarylAWVSRo5qeSpsnzn Content-Disposition:
form-data; name="fileToUpload"; filename="a.txt" Content-Type:
application/octet-stream

Testing

------WebKitFormBoundarylAWVSRo5qeSpsnzn--

上传的文件只包含“Testing”一词。

服务器代码:

Stream inputStream = Request.InputStream;
FileStream fileStream = new FileStream("c:\\test.txt", FileMode.OpenOrCreate);
inputStream.CopyTo(fileStream); 
fileStream.Close();

我的客户端 Javascript 中是否缺少任何未填充服务器上的 Request.Files 对象的内容?或者有什么方法可以只读取没有标题的文件内容?

【问题讨论】:

    标签: javascript asp.net html file-upload


    【解决方案1】:

    您应该使用 XHR2 的 FormData API 创建一个 multipart/form-data 请求正文。您可以通过append() 方法附加每个form-data 部分。它还接受File

    var formData = new FormData();
    formData.append("myfile", $("#fileobject").files[0]);
    
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "receive.aspx");
    xhr.send(formData);
    

    XHR2 将处理正确的标头和请求正文编码,并且在此示例中,该文件将在服务器端作为 form-data 部分提供,名称为 myfile

    【讨论】:

    • 谢谢,这行得通。但在 IE 中不起作用,包括 IE 10 Platform Preview 2!!!该死的IE。 :(
    • 不客气。 IE 确实还有很长的路要走(这并不奇怪)。
    【解决方案2】:

    除非请求的 ContentType 设置为 multipart/form-data,否则不会填充 Request.Files 集合。这就是为什么它对你来说总是空的。

    更新

    这是我在this site 上找到的一些javascript,它为文件上传创建了必要的标题/边界。不确定它是否适合您,但它可能:

    function fileUpload(url, fileData, fileName) {
       var fileSize = fileData.length,
         boundary = "xxxxxxxxx",
         xhr = new XMLHttpRequest();
    
       xhr.open("POST", url, true);
              // simulate a file MIME POST request.
       xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary);
       xhr.setRequestHeader("Content-Length", fileSize);
    
       var body = "--" + boundary + "\r\n";
       body += 'Content-Disposition: form-data; name="contents"; filename="' + fileName + '"\r\n';
       body += "Content-Type: application/octet-stream\r\n\r\n";
       body += fileData + "\r\n";
       body += "--" + boundary + "--";
    
       xhr.send(body);
       return true;
    }
    

    【讨论】:

    • 试过了。如果您看到我的代码,则该行已被注释。即使我更改使用 multipart/form-data 而不是 application/octet-stream,它也不会显示
    • 您可能还遇到了其他问题,但可以肯定的是,如果内容类型不是作为 multipart/form-data 传递的,它永远不会被填充。我查看了 ASP.NET 用来填充 Files 集合的内部方法,它专门寻找这个。
    • 谢谢。我只是尝试了一个常规的文件上传控件,发现标题有一个小的差异。常规上传包含以下Content-Type=multipart/form-data;边界=----WebKitFormBoundaryMaOZwv8AOdCyW0Mc。虽然 xhr 只包含 Content-Type=multipart/form-data;。边界不见了。这可能是原因吗?我自己无法添加边界。好像是随机生成的字符串
    • 查看我的更新。从那个例子来看,边界文本是什么似乎并不重要。
    • 感谢帕特的帮助。我在上面使用了 Baluc 的解决方案。它适用于 Chrome 和 Firefox,但不适用于 IE。暂时会和它一起生活。这是一个有趣的阅读虽然blog.timc.idv.tw/wp-content/uploads/HTML5_AJAX_File_Upload.pdf
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2011-02-21
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多