使用Servlet 3.0无法获取上传文件真实文件名,求技术解决方案
问题排查与解决方案
让我来帮你一步步排查这个上传文件真实文件名返回null的问题:
1. 核心问题:Servlet获取Part的参数名错误
你在Servlet里写的是:
filePart = request.getPart("uploadImageForNewCustomerformId");
但这个参数名uploadImageForNewCustomerformId是表单的ID,而不是上传文件对应的参数名。看你的代码细节:
- HTML文件输入框的name属性是
file:<input id="fileInput" type="file" name = "file"> - JS里FormData追加的参数名也是
file:formData.append("file", fileList[i], fileList[i].name)
所以你必须把获取Part的代码改成:
filePart = request.getPart("file");
如果需要支持多文件上传,建议用request.getParts()遍历所有Part,筛选出name为file的项进行处理。
2. 优化文件名获取逻辑(更可靠)
你自己实现的getFileName方法依赖手动解析content-disposition请求头,容易因为不同浏览器的头格式差异出问题。而你使用的WildFly 8.2支持Servlet 3.1规范,Part接口已经提供了getSubmittedFileName()方法,它会直接返回客户端上传的真实文件名,不用自己手动解析:
String fileNamer = filePart.getSubmittedFileName();
这个方法是官方标准实现,能避免手动解析头信息带来的各种潜在问题。
3. 额外检查点
- 确认JS中的
fileList变量正确获取到了用户选择的文件:比如在previewFile函数里是否正确把选中的文件赋值给了fileList,如果fileList为空,FormData里就没有文件数据,Servlet获取到的Part可能为空或没有文件名信息。 - 确保
@MultipartConfig注解配置正常(你已经添加了注解,不过可以确认下是否需要根据业务需求指定文件大小限制等参数,这不是当前问题的直接原因,但会影响后续上传逻辑)。
测试建议
修改Servlet的Part获取代码后,先打印filePart是否为null,如果不为null,再用getSubmittedFileName()获取文件名,应该就能得到正确的结果了。
内容的提问来源于stack exchange,提问作者Alex Mi
相关产品推荐
相关产品推荐

