基于Servlet3.0的文件上传

7 篇文章 0 订阅
7 篇文章 0 订阅

一 、基本流程

1.只需要按如下4个步骤进行:
  1. html中 表示文件上传控件
  2. form的 enctype=“multipart/form-data”
  3. 在Servlet类前加上 @MultipartConfig
  4. 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 可以设置 相应参数限制条件,必须声明,否则会报错
在这里插入图片描述

四、在服务器端保存静态资源

  1. 在服务器手动部署站点 ,在站点存储图片信息

  2. 在项目中如何去找此路径存储图片 信息
    在这里插入图片描述

  3. 在数据库中存储图片的访问路径:

在这里插入图片描述

  1. 显示商品信息,同时读取图片的存储路径
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值