【发布时间】:2010-05-13 13:30:59
【问题描述】:
我想使用 JSP Servlet 和 ejb 3.0 上传图片
【问题讨论】:
我想使用 JSP Servlet 和 ejb 3.0 上传图片
【问题讨论】:
首先,要使用 JSP 选择要上传的文件,您至少需要一个 HTML <input type="file"> 元素,该元素将显示文件浏览字段。如HTML forms spec 中所述,您需要在父<form> 元素中将请求方法设置为POST,并将请求编码设置为multipart/form-data。
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
因为Servlet 3.0 之前的 Servlet API 默认不支持上述请求编码(我认为您没有使用它,因为 EJB 3.0 是 Java EE 5.0 的一部分,而 Java EE 5.0 又只包含 Servlet 2.5) ,您不会在请求参数映射中看到任何内容。 request.getParameter("file") 将返回 null。
要在servlet中检索上传的文件和其他请求参数,您需要自己解析HttpServletRequest的InputStream。幸运的是,有一个常用的 API 可以帮助您摆脱繁琐的工作:Apache Commons FileUpload。
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
// <input type="file">
System.out.println("Field name: " + item.getFieldName());
System.out.println("File name: " + item.getName());
System.out.println("File size: " + item.getSize());
System.out.println("File type: " + item.getContentType());
} else {
// <input type="text|submit|hidden|password|button">, <select>, <textarea>, <button>
System.out.println("Field name: " + item.getFieldName());
System.out.println("Field value: " + item.getString());
}
}
基本上您只需要从FileItem 对象中获取InputStream,然后使用通常的Java IO 方式将其写入任何OutputStream。
InputStream content = item.getInputStream();
或者你也可以直接写:
item.write(new File("/uploads/filename.ext"));
在他们的主页上,您可以在User Guide 和Frequently Asked Questions 部分找到大量代码示例和重要提示和技巧。仔细阅读它们。
【讨论】:
@SuppressWarnings("unchecked") 来处理第一行代码,因为parseRequest() 只返回一个List