基于Servlet3.0的文件上传
一 、基本流程
1.只需要按如下4个步骤进行:
- html中 表示文件上传控件
- form的 enctype=“multipart/form-data”
- 在Servlet类前加上 @MultipartConfig
- request.getPart()获得Part对象
使用part.write(“文件路径和名称”);方法实现文件的另存。
<form action="${pageContext.request.contextPath }/fileupload.do"
method="post" enctype="multipart/form-data">
<input type="file" name="upfile">
<input type="submit" value="文件上传">
</form>
@MultipartConfig
@WebServlet("/fileupload.do")
public class FileUpLoadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Part part = request.getPart("upfile");
part.write("d:\\a.png");
}
}
二、文件上传在实际开发中需要解决的几个问题。
1、 表单中有其他元素时如何区分哪些是file组件。
使用元素的名称,与part对象的getName比较。
<form action="${pageContext.request.contextPath }/fileupload.do"
method="post" enctype="multipart/form-data">
<input type="text" name="username"> <br>
<input type="file" name="upfile"> <br>
<input type="file" name="upfile"> <br>
<input type="submit" value="文件上传">
</form>
Collection<Part> parts = request.getParts();
for (Part part : parts) {
if("upfile".equals(part.getName())){
}
}
2. 在服务器保存图片时一般都要重命名。
建议使用: UUID,随机数,系统当前时间精确纳秒
3. 如何确定源文件的后缀名
先要获得上传文件的完整的名称:在一个头信息里
String part.getHeader(“Content-Disposition”);
public class FileNameUitls {
//form-data; name="upfile"; filename="QQ图片20150525000806.jpg"
public static String getFileName(String str){
int index = str.lastIndexOf("=");
int length = str.length();
return str.substring(index+2, length-1);
}
public static String getTypeName(String fileName){
int index = fileName.lastIndexOf(".");
return fileName.substring(index);
}
}
Collection<Part> parts = request.getParts();
for (Part part : parts) {
if("upfile".equals(part.getName())){
String fileName = FileNameUitls.getFileName(part.getHeader("Content-Disposition"));
System.out.println(fileName);
String typeName = FileNameUitls.getTypeName(fileName);
System.out.println(typeName);
String newFileName = UUIDUtils.getUUID()+typeName;
System.out.println(newFileName);
}
}
4 获得站点根目录的物理路径的位置
String path = this.getServletContext().getRealPath("/");
<form action="${pageContext.request.contextPath }/fileupload.do"
method="post" enctype="multipart/form-data">
<input type="text" name="username"> <br>
<input type="file" name="upfile"> <br>
<input type="file" name="upfile"> <br>
<input type="submit" value="文件上传">
</form>
@MultipartConfig
@WebServlet("/fileupload.do")
public class FileUpLoadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Collection<Part> parts = request.getParts();
for (Part part : parts) {
if("upfile".equals(part.getName())){
String fileName = FileNameUitls.getFileName(part.getHeader("Content-Disposition"));
String typeName = FileNameUitls.getTypeName(fileName);
String newFileName = UUIDUtils.getUUID()+typeName;
//获得站点根目录物理目录位置
String path = this.getServletContext().getRealPath("/");
part.write(path+"img/"+newFileName);
}
}
}
}
public class FileNameUitls {
//form-data; name="upfile"; filename="QQ图片20150525000806.jpg"
public static String getFileName(String str){
int index = str.lastIndexOf("=");
int length = str.length();
return str.substring(index+2, length-1);
}
public static String getTypeName(String fileName){
int index = fileName.lastIndexOf(".");
return fileName.substring(index);
}
}
二、Part接口
HttpServletRequest 提供了两个方法用于从请求中解析上传的文件:
Part getPart(String name): 用于获取请求中指定name的文件
Coolection< Part > getParts(); 获取请求中全部的文件
每一个文件用 javax.servlet.http.Part 对象来表示,该接口提供了很多处理文件的方法
三、@MultipartConfig
结合 HttpServletRequest 对象和@MultipartConfig 注解来处理文件上传.
指定缓存大小和临时目录
@MultipartConfig 可以设置 相应参数限制条件,必须声明,否则会报错
四、在服务器端保存静态资源
-
在服务器手动部署站点 ,在站点存储图片信息
-
在项目中如何去找此路径存储图片 信息
-
在数据库中存储图片的访问路径:
- 显示商品信息,同时读取图片的存储路径