Servlet(九)——文件上传和下载

文件上传和下载

在上网的时候我们常常遇到文件上传的情况, 例如上传头像、上传资料等;当然除了上传,遇见下载的情况也很多,接下来看看我们servlet 中怎么实现文件的上传和下载。

1.文件上传

文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件, 后台接收并保存文件,这才是一个完整的文件上传。

1.1 前台页面实现

在做文件上传的时候, 会有一个上传文件的界面, 首先我们需要一个表单,并且表单的请求方式为 POST;其次我们的 form表单的 enctype 必须设为"multipart/form-data",即 enctype=“multipart/form-data”,意思是设置表单的类型为文件上传表单。 默认情况下这个表单类型是"appli cation/x-www-form-urlencoded",不能用于文件上传。只有使用了multipart/form-data 才能完整地传递文件数据。

<%--    
	文件上传表单
		1.准备表单
		2.设置表单的提交类型为POST请求 method=" post"
		3.设置表单类型为文件上传表单 enctype="multipart/form-data"
		4.设置文件提交的地址
		5.准备表单元素:
			1.普通的表单项 type-"text"
			2.文件项 type="file"
		6.设置表单元素的name属性值 (表单提交一定要设置表单元素的name属性值,否则后台无法接收数据!)

--%>
<form method="post" action="uploadServlet" enctype="multipart/form-data">
	姓名:<input type="text"name="uname" > <br>
	文件:<input type="file"name="myfile"><br>
	<button type="submit">提交</button>
</form>

1.2 后台代码实现

使用注解@MultipartConfig将下个Servlet标识为支持文件上传。 Servlet将multipart/form-data 的POST请求封装成Part,通过 Part对上传的文件进行操作。


//设置请求的编码格式
request.setCharacterEncoding("UTF-8");
//获取普通表单项(文本框)
string uname = request.getParameter("uname"); // "'uname "代表的是文本框的name属性值
//通过getPart(name) 方法获取Part对象(name代表的是页面中file文件域的name属性值)
Part part = request.getPart("myfile");
//通过Part对象,获取上传的文件名
String fi TeName = part.getSubmi ttedFi 1 eName() ;
//获取上传文件需要存放的路径(得到项目存放的真实路径)
String realPath=request.getServletContext().getRealPath("/");
/将文件上传到指定位置
part.write(realPath + fileName);
	

2.文件下载

文件下载,即将服务器上的资源下载(拷贝)到本地, 我们可以通过两种方式下载。 第一种是通过超链接本身的特性来下载;第二种是通过代码下载。

2.1 超链接下载

当我们在HTML或JSP页面中使用a标签时, 原意是希望能够进行跳转, 但当超链接遇到浏览器不识别的资源时会自动下载;当遇见浏览器能够直接显示的资源, 浏览器就会默认显示出来,比如txt、png、jpg等。 当然我们也可以通过download 属性规定浏览器进行下载。 但有些浏览器并不支持。
默认下载

指定download属性下载
I
<!一当超链接遇到浏览器识别的资源时, 默认不会下载。通过down1oad属性可进行下载–> <ahref="test.txt"down1oad>超链接下载
download属性可以不写任何信息, 会自动使用默认文件名。 如果设置了download属性的值,则使用设置的值做为文件名。当用户打开浏览器点击链接的时侯就会直接下载文件。

2.2 后台代码下载

实现步骤:

1.需要通过response.setContentType方法设置 Content-type头字段的值, 为浏览器无法使用某种方式或激活某个程序来处理的MIME类型,例如 "application/octet-stream"或"application/x-msdownload"等。
2.需要通过 response.setHeader方法设置 Content-Disposition头的值为 “attachment;filename=文件名”
3.读取下载文件,调用response. getOutputStream方法向客户端写入附件内容。

System.out.println("文件下载……");
//设置请求的编码格式
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
//获取参数(得到要下载的文件名)
String fileName=req.getParameter("fileName");
//参数的非空判断 trim():去除字符串的前后空格
if(fileName==null ||"".equals(fileName.trim())){
   resp.getWriter().write("请输入要下载的文件名!");
   resp.getWriter().close();
   return;
}
//得到图片存放的路径
String path=req.getServletContext().getRealPath("/download");
//通过路径得到file对象
File file=new File(path+fileName);
//判断文件对象是否存在并且是一个标准文件
if(file.exists() && file.isFile()){
   //设置响应类型(浏览器无法使用某种方式或激活某个程序来处理的MIME类型)
   resp.setContentType("application/x-msdownload");
   //设置响应头
   resp.setHeader("Content-Disposition","attachment;filename="+fileName);
   //得到file文件输入流
   InputStream in =new FileInputStream(file);
   //得到字节输出流
   ServletOutputStream out=resp.getOutputStream();
   //定义byte数组
   byte[] bytes=new byte[1024];
   //定义长度
   int len=0;
   //循环输出
   while ((len=in.read(bytes))!=-1){
       //输出
       out.write(bytes,0,len);

   }
   //关闭资源
   out.close();
   in.close();

} else {
   resp.getWriter().write("文件不存在,请重试!");
   resp.getWriter().close();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值