在Servlet 3.0中以编程方式访问MultiPartConfig

我使用Servlet 3 @MultiPartConfig注释在我的应用程序中实现文件上传。 我需要在运行时设置multipart-config位置参数(而不是annotaion参数中的硬编码)。 是否有任何API可以编程访问servlet的multipart-config?

谢谢

@MultiPartConfig实际上只是容器的标记接口。 初始化servlet时,提供的注释值将使用代理对象映射到它。 当传入请求是multipart / form-data时,上载的部分将映射到请求,容器将根据注释中的值和请求中的部分执行必要的工作。 您无法拦截此过程,因为它全部发生在容器的内部。 但是,有一种选择。 它需要第二次执行文件系统操作。 由于您拥有所有部件,因此您可以重建文件并将其“重新上传”到您选择的位置。 它可能看起来像下面的方法。 请记住,虽然我在自己的servlet中快速测试了这个,以certificate它的概念显然不是完成代码:

 @Override protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { httpServletResponse.setContentType("text/html"); PrintWriter printWriter = httpServletResponse.getWriter(); InputStream inputStream; FileOutputStream fileOutputStream; for (Part part : httpServletRequest.getParts()) { inputStream = httpServletRequest.getPart(part.getName()).getInputStream(); int i = inputStream.available(); byte[] b = new byte[i]; inputStream.read(b); String fileName = ""; for (String temp : part.getHeader("content-disposition").split(";")) { if (temp.trim().startsWith("filename")) { fileName = temp.substring(temp.indexOf('=') + 1).trim().replace("\"", ""); } } String uploadDir = "/temp"; fileOutputStream = new FileOutputStream(uploadDir + "/" + fileName); fileOutputStream.write(b); inputStream.close(); fileOutputStream.close(); printWriter.write("Uploaded file " + uploadDir + "/" + fileName + "."); } } 

我也遇到了同样的问题而且解决方案很简单:标准的Servlet 3.0文件上传还不够:只需从Apache FileUpload Commons中获取jar就可以了

只需使用Streaming API查看这个清晰的示例

  ServletFileUpload upload = new ServletFileUpload(); // Parse the request FileItemIterator iter = upload.getItemIterator(request); while (iter.hasNext()) { FileItemStream item = iter.next(); String name = item.getFieldName(); InputStream stream = item.openStream(); if ( item.isFormField() == false) System.out.println("File field " + name + " with file name " + item.getName() + " detected."); FileOutputStream fos = new FileOutputStream("your_location"); Streams.copy ( stream, fos, true); } }