java 文件上传 servlet_JavaWeb:servlet实现下载与上传功能

本文内容:

servlet实现下载功能

servlet实现上传功能

首发日期:2018-07-21

servlet实现下载功能

实现流程

1.首先制作一个jsp页面,主要是用来触发下载的。这里可以根据你的想法来做,当然servlet那边就要相应的更改了。我这里使用一个简单的a标签来触发。

caeef7d606220d2bd068512ac92d80a1.png

2.设置响应信息,告诉浏览器要将传过来的数据识别成下载;根据提交上来的数据找到对应文件,转成流,返回给浏览器;

114081481dcd41d4b8687c010eea8b82.png

中文文件名问题:

虽然真的不建议使用中文文件名。但还是给一下处理手段。

先给出触发的条件:b358451b4d3e9d91af348ab346eee79c.png

中文文件名需要解决两个问题:

1.浏览器提交上来的中文文件名要识别:这里是普通的get和post的中文数据问题

get方式:String filename = new String(filename.getBytes("iso-8859-1"),"utf-8"); 【tomcat8不需要】

post方式:request.setCharacterEncoding("utf-8")

2.返回给浏览器时,浏览器能识别,即能正确显示回来的下载文件名(如果你下载东西遇到过文件名乱码,就是这个没处理好):

处理方法:

a8131882025e2642de96a4555a00729f.png

protected voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {//1.获取下载目标

String filename = request.getParameter("target");

System.out.println(filename);//2.找到下载目标

String path = getServletContext().getRealPath("download/" +filename);

File file= newFile(path);if(file.exists()) {//3.如果文件存在,那么设置响应的内容为下载,告诉浏览器将信息识别成下载//判断一下浏览器

String agent = request.getHeader("User-Agent");if (agent.contains("Firefox")) {//火狐

BASE64Encoder base64Encoder = newBASE64Encoder();

filename= "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";

}else {//ie和谷歌

filename = URLEncoder.encode(filename, "utf-8");

}

response.setHeader("Content-Disposition", "attachment; filename=" +filename);//4.获取文件流

FileInputStream fis = newFileInputStream(file);

OutputStream os=response.getOutputStream();//5.返回给浏览器

int len = 0;byte[] buffer = new byte[1024];while ((len = fis.read(buffer)) != -1) {

os.write(buffer,0, len);

}

os.flush();//flush一下,确保一下

os.close();

fis.close();

}else{

response.setContentType("text/html;charset=UTF-8");

response.getWriter().write("找不到文件");

}

}

servlet实现上传功能

1.创建一个页面,用于上传:【这里只用了一个上传,但事实上下面的代码是支持多个上传的】

babb53357591eece83b3afdcc82265df.png

【当使用了enctype="multipart/form-data"之后,普通输入框的内容,将无法使用getParameter获取】

2.导入包,以便使用fileupload:commons-fileupload-1.2.1.jar和commons-io-1.4.jar【这里导入io包主要是用于io流对接,上传的文件流直接对接输出流;如果你不导入,那么需要手动处理流中的数据!】

3.创建DiskFileItemFactory工厂类,用来:DiskFileItemFactory factory=new DiskFileItemFactory();

4.创建解析类,用于解析resquest:ServletFileUpload upload=new ServletFileUpload(factory);

5.解析内容,获取一个list,数据都存储在list中:List list = upload.parseRequest(request);

现在信息封装方法已经跟之前没有文件上传时不一样了,所以需要解析:

0213256610262c26ccce0da0a6b1314b.png

6.操作list【list中的每一个元素都是FileItem对象,可以用FileItem对象.isFormField()来判断是否是表单项(认为文件是上传项);如果是真的话,说明是普通的输入框内容,如果你想要存储输入框提交的内容,那么这里可以处理一下;不为真说明是上传项,这里可以针对流进行操作】

如何操作?

对于普通表单项:item.getFieldName()可以获取对应的name;item.getString()可以获取对应的值

对于上传项,需要操作它的流:item.getInputStream()可以获取对应的数据流。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

request.setCharacterEncoding("utf-8");

DiskFileItemFactory factory=new DiskFileItemFactory();//1.创建DiskFileItemFactory工厂类

ServletFileUpload upload=new ServletFileUpload(factory);//2.创建解析类,用于解析resquest

try{

List list = upload.parseRequest(request);//3.解析内容,获取一个list,数据都存储在list中

for(FileItem item:list) {if(item.isFormField()) {//判断是否是普通的表单内容

System.out.println(item.getFieldName());//获取的是表单中name属性的值

System.out.println(item.getString());//获取的是对应的表单的值

}else {//为假,说明是上传项//获取流,进行处理

InputStream ism =item.getInputStream();

String path=getServletContext().getRealPath("/upload/");

System.out.println(path);

String filename= item.getName();//这里getName可以获取文件名

System.out.println(filename);

File file=new File(path+filename);

file.createNewFile();//这里不做文件存在性和名字重复判断

OutputStream fos = newFileOutputStream(file);//这里直接借助commons.io来做io对接,不然需要做流的读取和写入

IOUtils.copy(ism,fos);//把输入流的数据拷贝到输出流

IOUtils.closeQuietly(ism);

IOUtils.closeQuietly(fos);

}

}

}catch(FileUploadException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值