2

这是一个非常具体的问题。我希望这里有人对 FileUpload API 有很好的了解。

如果您使用过此 API,您应该知道,当超过文件的最大大小时,无法读取下一个项目,因为抛出 FileSizeLimitExceededException 并且如果您尝试再调用一次hasNext()方法来迭代下一个项目由于输入流已关闭并且您尝试再次读取它,因此引发 IOException。

这种情况非常糟糕,因为无法读取下一个参数。假设这种形式:

<form action="..." method="post" enctype="multipart/form-data">
    <input type="hidden" name="param1" value="foo"/>
    <input type="file" name="myFile"/><br/>
    <input type="hidden" name="param2" value="bar"/>
    <input type="submit"/>
</form>

现在文件超过了最大大小。结果:
读取“param1”。
“myFile”生成 FileSizeLimitExceededException。
未读取“param2”。

我正在尝试重写部分 API - 没有运气 - 因为我想阅读下一项(在本例中为“param2”)。

有人遇到过同样的问题吗?你是怎么修好的?

谢谢。


编辑:嗯,我已经实现了 BalusC 提出的解决方案。未来:
FileUpload 包装器
FileUpload 包装器的使用

如果您认为此包装器需要其他任何内容,请直接说出来。我不接受它作为真正的解决方案,因为理想的是修改和修复 API 本身。

4

1 回答 1

1

一种不破解 API 的方法是将上传文件大小限制设置为“无限制”,然后自行检查上传文件大小FileItem#getSize()。在最终用户得到反馈之前,这可能只需要更长的时间,因为需要首先完整读取整个文件(但无论如何您都需要这样做才能获得所有后续项目)。

作为一个完全不同的选择,您可能希望查看新的HTML5 FileAPI,它为您提供了一种在实际发送请求之前使用 JavaScript 检查文件大小的方法。

var size = document.getElementById("fileFieldId").files[0].size;
// ...
于 2011-09-17T14:27:33.993 回答