如何通过表单上传文件并让 Java 将其作为 InputStream 处理? [复制]

Posted

技术标签:

【中文标题】如何通过表单上传文件并让 Java 将其作为 InputStream 处理? [复制]【英文标题】:How do I upload a file through a form and have Java process it as an InputStream? [duplicate] 【发布时间】:2011-05-27 08:56:01 【问题描述】:

我有一个 Java 类,它接受 InputStream 并对传入的数据进行编码。我如何让一些工作能够接受来自用户的文件上传,但将其视为流而不先将整个内容保存到磁盘和使用 FileInputStream?

基本上我正在寻找一些 Java 中的轻量级 Web 框架,它可以让我获取用户上传的文件作为数据流。

【问题讨论】:

【参考方案1】:

如果还没有完成,请安装一个 webserver/servletcontainer,例如 Apache Tomcat。

如果您选择 Tomcat 6.x,则使用Apache Commons FileUpload 将上传的文件作为InputStream 获取。如果您选择 Tomcat 7.x (Servlet 3.0),则使用HttpServletRequest#getPart(),然后使用Part#getInputStream() 获取上传的文件作为InputStream

【讨论】:

【参考方案2】:
import org.apache.commons.fileupload.FileItemStream;
 import org.apache.commons.fileupload.FileItemIterator;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;

 import java.io.InputStream;
 import java.io.IOException;
 import java.util.logging.Logger;

 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;

 public class FileUpload extends HttpServlet 
   private static final Logger log =
       Logger.getLogger(FileUpload.class.getName());

   public void doPost(HttpServletRequest req, HttpServletResponse res)
       throws ServletException, IOException 
     try 
       ServletFileUpload upload = new ServletFileUpload();
       res.setContentType("text/plain");

       FileItemIterator iterator = upload.getItemIterator(req);
       while (iterator.hasNext()) 
         FileItemStream item = iterator.next();
         InputStream stream = item.openStream();

         if (item.isFormField()) 
           log.warning("Got a form field: " + item.getFieldName());
          else 
           log.warning("Got an uploaded file: " + item.getFieldName() +
                       ", name = " + item.getName());

           // You now have the filename (item.getName() and the
           // contents (which you can read from stream).  Here we just
           // print them back out to the servlet output stream, but you
           // will probably want to do something more interesting (for
           // example, wrap them in a Blob and commit them to the
           // datastore).
           int len;
           byte[] buffer = new byte[8192];
           while ((len = stream.read(buffer, 0, buffer.length)) != -1) 
             res.getOutputStream().write(buffer, 0, len);
           
         
       
      catch (Exception ex) 
       throw new ServletException(ex);
     
   
 

该示例是从 Google App Engine 文档中提取的,因为 GAE 也不允许应用程序在磁盘上写入文件。原始示例可以找到here

【讨论】:

以上是关于如何通过表单上传文件并让 Java 将其作为 InputStream 处理? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 PHP 使用 curl 上传文件 [关闭]

如何使用 React Native POST 或 PUT 原始二进制文件

如何使用 jQuery 或其他 js 框架将字符串作为文件上传

Angularjs如何上传多部分表单数据和文件?

上传完成后如何将新文件名作为隐藏表单输入返回到 Dropzone?

如何使用无效标识符作为 django 表单字段名称