版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38095094/article/details/75965679
文件上传和下载
主要使用两个jar包可以实现多种不同类型文件的上传
* commons-io-1.4.jar
* commons-fileupload-1.2.1.jar
文件上传的主要思路是:
- 首先在服务器端创建一个工厂作为空间
- 创建解析器,将工厂放入解析器中
- 将得到的请求放入解析器中解析
- 遍历得到的解析,判断是不是传输文件
- 若为传输文件,获得文件名,设置保存的路径,用IO流将它输出保存到服务器端
//第一件事就是要将两个jar包引入到工程的web-lib目录下
//1.创建工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//2.根据工厂配置解析器
ServletFiledUpload fileUpload = new ServletFileUpload(factory);
//3.根据解析器获取请求的FileItem集合
List<FileItem> list = fileUpload.parstRequest(request);
//4.遍历FileItem集合
for(FileItem item:list){
//5.判断请求是不是上传文件
if(item.isFormField){
//成立则证明不是上传文件
//获得名称,例如是向文本框输入内容传输,则得到文本框的内容
String fileName = item.getFieldName();
String value = item.getString();
}else{
//获得文件名
String fileName1 = item.getName();
//在不同浏览器中,传输过来的文件名称不同,有的是传输绝对路径,有的是传输相对路径
if(fileName1.contains("\\"){
//将绝对路径变为相对路径
fileName1 = fileName1.subString(fileName.lastIndexOf("\\")+1);
}
//设置你要存储的路径
//假如保存在该项目的WEB-INF目录下
String realPath = servletContext().getRealPath()+"/WEB-INF"+fileNames;
//获得输入流
BufferedInputStream inputStream = new BufferedInputStream(item.getInputStream());
//获得输出流
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(realPath));
int temp = 0;
while ((temp = inputStream.read())!=-1){
System.out.println("来过这里");
outputStream.write(temp);
}
输出完毕后记得关闭缓冲流
outputStream.flush();
outputStream.close();
inputStream.close();
}
}
}
注意:当文件过大时,可以先设置一个缓冲区,将传输的文件先放到一个暂时目录中,由系统将它复制过去,最后将临时文件删除即可
//在创建工厂之后设置一个缓冲区
factory.setSizeThreshold(1024*1024*8); //设置当传输文件超过8M的时候会将文件暂时放到缓冲区
String realPath = "设置你临时文件存放的路径";
File repository = new File(realPath);
factory.setRepository(repository);
//解决中文乱码问题 ,在解析器中设置
fileUpload.setHeaderEncoding("UTF-8");
//最后文件传输结束时要记得删除临时文件
item.delete(); //将遍历文件的临时文件删除
### 文件下载
* 一般浏览器具有这样的机制,当你点击一个连接,假如文件类型是比较简易的类型比如txt、jpg类型的,浏览器会直接打开而不是询问你时候下载,如果时docx等类型的文件会询问你是否下载。
* 因此要想文件一直都询问你是否下载,可以设置两个响应头字段,使得文件以附件形式保存
* 两个响应头字段分别是(默认fileName为要下载的文件名):
+ response.setContentType(getServletContent().getMimeType(fileName));
+ response.setHeader(“Content-Disposition”,”attachment;filename”+fileName);
String fileName = request.getParameter("file");
//获取文件的绝对路径
String absolutePath = "你可以被下载的资源所存放的路径"+fileName;
//必须设置两个响应头
response.setCharacterEncoding("utf-8");
response.setContentType(getServletContext().getMimeType(fileName));
response.setHeader("Content-Disposition", "attachment;filename"+fileName);
File file = new File(absolutePath);
BufferedInputStream bif = new BufferedInputStream(new FileInputStream(file));
//获取浏览器输出流
BufferedOutputStream bof = new BufferedOutputStream(response.getOutputStream());
int tmp = 0;
byte[] bt = new byte[1024];
while((tmp=bif.read(bt))!=-1){
bof.write(bt, 0, tmp);
}
bof.close();
bif.close();
}
下载之后的文件一般会保存C盘User目录的下载文件中