如何通过表单上传文件并让 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 处理? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 React Native POST 或 PUT 原始二进制文件
如何使用 jQuery 或其他 js 框架将字符串作为文件上传