5

有两种方法可以使用 Apache FileUpload 库。

上传文件

http://commons.apache.org/fileupload/using.html

和流式文件上传 API

http://commons.apache.org/fileupload/streaming.html

它们都工作得很好,只是流 API 似乎没有办法在处理流之前检查文件大小。

这是因为 Streaming API 从根本上不知道文件大小,还是因为我需要手动读取一些标头或其他内容来获取 Multipart 上传大小?

4

1 回答 1

14

如果不消耗整个 HTTP 请求正文,就无法知道多部分请求的一部分的大小。而且一旦开始消费 HTTP 请求体,就不能中途停止消费。它必须被消耗到最后一个字节才能返回响应。这就是 HTTP 和 TCP/IP 的本质。但是,为了保持服务器内存使用率低,您可以在读取字节超过大小时丢弃它们(即在读取循环中检查它并且不要将它们分配给任何变量)。

最好的办法是在上传之前在 JavaScript 中验证文件长度。这在支持HTML5 FileAPI 的浏览器中受支持。当前版本的 Firefox、Chrome、Safari、Opera 和 Android 都支持它。IE9还不支持,以后的IE10会支持。

<input type="file" ... onchange="checkFileSize(this)" />

checkFileSize()看起来像这样的地方

function checkFileSize(inputFile) {
    var max = 10 * 1024 * 1024; // 10MB

    if (inputFile.files && inputFile.files[0].size > max) {
        alert("File too large."); // Do your thing to handle the error.
        inputFile.value = null; // Clear the field.
    }
}
于 2012-05-10T18:01:42.660 回答