如何通过表单上传文件并让 Java 将其作为输入流处理?

发布于 2024-10-08 08:17:53 字数 167 浏览 7 评论 0原文

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

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

I have a Java class that accepts an InputStream and encodes the data coming in. How do I get something working that will accept a file upload from the user, but treat it as a stream without saving the whole thing to disk first and using FileInputStream?

Basically I'm looking for some lightweight web framework in Java that will just let me get a file uploaded by the user as a data stream.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

樱花落人离去 2024-10-15 08:17:53

如果尚未完成,请安装 Web 服务器/servlet 容器,例如 Apache Tomcat

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

If not done yet, install a webserver/servletcontainer like Apache Tomcat.

If you pick Tomcat 6.x, then use Apache Commons FileUpload to get the uploaded file as an InputStream. If you pick Tomcat 7.x (Servlet 3.0), then use HttpServletRequest#getPart() and then Part#getInputStream() to obtain the uploaded file as an InputStream.

枕头说它不想醒 2024-10-15 08:17:53
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 也不允许应用程序在磁盘上写入文件。原始示例可以在此处找到

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);
     }
   }
 }

The example is extracted from Google App Engine documents since GAE also doesn't allow the application to write files on disk. The original example can be found here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文