spring - 如何检查文件是否完全上传到 Spring 控制器
问题描述
我在需要上传文件的应用程序中使用 Spring MVC。如果文件大小大于 30 MB,我们需要调用其他第三方服务并将错误发送回 UI。
由于我们需要在检查文件大小后调用其他服务,所以我在 Spring 控制器中编写了代码来检查文件大小。但即使文件大小大于 30 MB,它也没有给我错误。
代码片段如下:
public ResponseEntity<JsonResponse> storeUploadedDocument(@RequestPart("file") MultipartFile file) throws IOException {
long fileSize = file.getSize();
if (fileSize > (30 * 1024 * 1024)) {
//File size if greater than 30 MB
// Call thirdparty service for remaining process
// send error code back to ui
}
}
根据一些参考资料, MultipartFile.getSize() 不会返回完整的文件大小,但只会返回调用此方法时上传的文件的大小。
那么,是否可以检查文件上传过程是否已完成并检查总文件大小?
我们如何在 Spring Controller 上实现此功能?
解决方案
这不是 Spring 的MultipartFile
工作方式。
spring mvc ServletDispatchercheckMultipart
在其 doDispatch 的早期调用:
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
processedRequest = checkMultipart(request);
并checkMultipart
最终委托给request.getParts()
:
private void parseRequest(HttpServletRequest request) {
try {
Collection<Part> parts = request.getParts();
因此,真正的答案是这将取决于您的应用程序服务器如何实现对 multipart/formdata 请求的解析。
例如, Tomcat 的实现会在从该方法返回之前将文件上传到临时文件,因此在将实例传递给您的 ContollergetParts
时文件已经上传。MultipartFile
其他应用服务器的行为可能有所不同,但老实说,我对此表示怀疑。无论哪种方式,您都不想依赖一种行为。最好找到一个不同的、可靠的解决方案。例如,通过此端点限制文件上传的大小。
推荐阅读
- ruby-on-rails - 如何为 Rails 活动记录中的 JSON 列/属性设置默认值?
- elasticsearch - Elasticsearch 订单查询未正确排序
- python - 执行查询以从 python flask sqlalchemy 中的文件创建函数时出错
- html - 我在外部 div 内水平有 2 个 div。当第二个内部 div 的内容变长时,它应该包裹在自己的 div 区域中
- winapi - 如何在 Windows 路径中使用非 ASCII 字符加载 hunspell 字典?
- ruby-on-rails - 如何将浮点形式的时间(hh.mm)除以红宝石中的整数?
- c# - 最小起订量具有 SQL 调用 c# 的方法
- autocad - 在写入和测试阶段自动更新
- jpa - JPA 映射到同一类对象的集合
- jenkins-jira-trigger - jira-trigger-webhook-receiver 抛出 JSONException: JSONObject["name"] not found