文件上传和下载的实质:文件拷贝
文件上传:从本地拷贝到服务器磁盘上 客户端需要编写文件上传表单---->服务端需要编写代码接受上传的文件
文件下载:从服务器磁盘上拷贝到本地磁盘 需要编写服务端的代码,客户端的下载的工作浏览器内核解决的
文件上传的步骤:(划重点)
1.客端的form表单method="post",enctype="multipart/form-data"(文件上传表单)
2.导入jar包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar
3.服务器端:
1).创建磁盘文件工厂:DiskFileItemFactory
2).创建文件上传核心类:ServletFileUpload
3).解析request集合(有普通表单项,文件项):.parseRequest(request);
4).遍历FileItem集合:List<FileItem>
5).判断普通表单项/文件上传:.isFormField();
// 接收上传文件
try {
// 1.创建磁盘文件工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2.创建文件上传核心类
ServletFileUpload upload = new ServletFileUpload(factory);
// 3.解析request集合(有普通表单项,文件项)
List<FileItem> FileItems = upload.parseRequest(request);
// 4.遍历FileItem集合
for (FileItem fileItem : FileItems) {
// 5.判断普通表单项/文件上传
boolean bool = fileItem.isFormField();
if (bool) {// 普通表单项
String name = fileItem.getFieldName();
String value = fileItem.getString("UTF-8");// 设置普通表单项的编码方式
System.out.println(name + "----" + value);
} else {// 文件项
String filename = fileItem.getName();// 得到文件名称
InputStream in = fileItem.getInputStream();// 得到文件输入流
String path = this.getServletContext().getRealPath("/upload");// 文件存放的文件夹地址
OutputStream out = new FileOutputStream(path + "/" + filename);// 文件存放的地址
// 文件拷贝的模板代码
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
文件上传API:
//接收上传文件
try {
//1.创建磁盘文件工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置缓存大小,单位是字节
factory.setSizeThreshold(1024*1024);
//设置临时文件目录
factory.setRepository(new File("/temporaryfile"));
//2.创建文件上传核心类
ServletFileUpload upload = new ServletFileUpload(factory);
boolean bool = upload.isMultipartContent(request);//判断否是一个文件上传表单
upload.setHeaderEncoding("UTF-8");//设置文件名的编码方式
if(bool){
//3.解析request集合(有普通表单项,文件项)
List<FileItem> FileItems = upload.parseRequest(request);
//4.遍历FileItem集合
for (FileItem fileItem : FileItems) {
//5.判断普通表单项/文件上传
boolean isFormField = fileItem.isFormField();
if(isFormField){//普通表单项
String name = fileItem.getFieldName();
String value = fileItem.getString("UTF-8");//设置普通表单项的编码方式
System.out.println(name+"----"+value);
}else{//文件项
fileItem.delete();//删除临时文件
String filename = fileItem.getName();//得到文件名称
InputStream in = fileItem.getInputStream();//得到文件输入流
String path = this.getServletContext().getRealPath("/upload");//文件存放的文件夹地址
OutputStream out = new FileOutputStream(path+"/"+filename);//文件存放的地址
/*//文件拷贝的模板代码
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}*/
IOUtils.copy(in, out);//文件拷贝(通过工具类)
in.close();
out.close();
}
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
文件下载API
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取文件名称
String filename = request.getParameter("filename");
System.out.println(filename);
//要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
response.setContentType(this.getServletContext().getMimeType(filename));
//告诉客户端该文件不是直接解析 而是以附件形式打开(下载)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//获取文件的绝对路径
String path = this.getServletContext().getRealPath("/download/"+filename);
System.out.println(path);
//获得该文件的输入流
InputStream in = new FileInputStream(path);
//获得输出流---通过response获得的输出流 用于向客户端写内容
ServletOutputStream out = response.getOutputStream();
//文件拷贝的模板代码
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
// out.close();在servlet的response中ServletOutputStream使用完后会自动关闭,因为out是从servlet中获取的
}