首先准备上传页面:upload.html
- form的method必须是post,get不能上传文件
- 还需要加上
enctype="multipart/form-data"
,表示提交的数据是二进制文件 - 需要提供
type="file"
的字段进行上传
<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<form action="uploadPhoto" method="post" enctype="multipart/form-data">
英雄名称:<input type="text" name="heroName" /> <br>
上传头像:<input type="file" name="filepath" /> <br>
<input type="submit" value="上传">
</form>
准备UploadPhotoServlet
- 在UploadPhotoServlet进行上传功能开发
- 需要用到两个第三方的jar包,
commons-io-1.4.jar
和commons-fileupload-1.2.2.jar
,在下面下载,并放在WEB-INF/bin下 - 选中两个jar->右键->Build Path
- 链接:https://pan.baidu.com/s/1THFbmAcfh8tWee0oQVLzyQ
- 提取码:fwfw
- 完整Servlet代码
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadPhotoServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String filename = null;
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件的大小限制为1M
factory.setSizeThreshold(1024 * 1024);
List items = null;
try {
items = upload.parseRequest(req);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {
// 根据时间戳创建头像文件
filename = System.currentTimeMillis() + ".jpg";
// 根据getRealPath获取上传文件夹
String photoFolder = req.getServletContext().getRealPath("uploaded");
File f = new File(photoFolder, filename);
f.getParentFile().mkdirs();
// 通过item.getInputStream()获取浏览器上传的文件的输入流
InputStream is = item.getInputStream();
// 复制文件
FileOutputStream fos = new FileOutputStream(f);
byte b[] = new byte[1024 * 1024];
int length = 0;
while (-1 != (length = is.read(b))) {
fos.write(b, 0, length);
}
fos.close();
} else {
System.out.println(item.getFieldName());
String value = item.getString();
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(value);
}
}
String html = "<img width='200' height='150' src='uploaded/%s' />";
resp.setContentType("text/html");
resp.getWriter().format(html, filename);
}
}
配置web.xml
<servlet>
<servlet-name>UploadPhotoServlet</servlet-name>
<servlet-class>UploadPhotoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadPhotoServlet</servlet-name>
<url-pattern>/uploadPhoto</url-pattern>
</servlet-mapping>
上传测试
- 访问:http://127.0.0.1/upload.html
-
效果图
image.png
如何处理其他非File字段
- 因为浏览器指定了以二进制的形式提交数据,那么就不能通过常规的手段获取非File字段:
request.getParameter("heroName")
- 在遍历Item时(Item即对应浏览器提交的字段),可以通过:
item.isFormField
,来判断是否是常规字段还是提交的文件
image.png
image.png
网友评论