文件的上传和下载
文件的上传
- 要有一个form标签,method=post请求
- form标签的 enctype 属性值必须为 multipart/form-data,表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器
- 在form标签中使用 input type="file" 添加上传的文件
- 编写服务器代码接收、处理上传的数据
<form action="http://localhost:8080/myjavaweb/receiveServlet" enctype="multipart/form-data" method="post"> 用户名:<input type="text" name="username"/><br> 头 像:<input type="file" name="photo"/><br> <input type="submit" value="上传"> </form>

//服务器用流的形式接收数据 ServletInputStream inputStream = req.getInputStream(); byte[] buffer = new byte[1024000]; int read = inputStream.read(buffer); System.out.println(new String(buffer, 0, read));
commons.fileload常用API
引入依赖

ServletFileUpload类:用于解析上传的数据
FileItem类:表示每一个表单项
判断当前上传的数据格式是否是多段的格式:boolean ServletFileUpload.isMultipartContent(HttpServletRequest request)
解析上传的数据:public List<FileItem> parseRequest(HttpServletRequest request)
判断当前这个表单项,是普通的表单项,还是上传的文件类型,true表示普通类型的表单项,false表示上传的文件类型:boolean FileItem.isFormField()
获取表单项的name属性值:String FileItem.getFieldName()
获取当前表单项的值:String FileItem.getString()
获取上传的文件名:String FileItem.getName()
将上传的文件写到参数 file指向的磁盘位置:void FileItem.write(file)
package com.tang.web.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、先判断上传的数据是否多段数据(是多段的数据,才是文件上传
if (ServletFileUpload.isMultipartContent(req)){
//创建FileItemFactory工厂实现类
FileItemFactory factory = new DiskFileItemFactory();
//创建用于解析上传数据的工具类ServletFileUpload类
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
//解析上传的数据,得到每一个表单项FileItem
try {
List<FileItem> list = servletFileUpload.parseRequest(req);
//循环判断每一个表单项,是普通类型还是上传的文件
for (FileItem item : list) {
if (item.isFormField()){
//普通表单项
System.out.println("name属性:"+item.getFieldName());
System.out.println("表单项的值:"+item.getString("UTF-8")); //解决乱码问题
}
else {
//上传文件
System.out.println("name属性:"+item.getFieldName());
System.out.println("上传的文件名:"+item.getName());
item.write(new File("F:\\大学作业\\我的学习\\包\\"+item.getName()));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
文件的下载
package com.tang.web.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、获取要下载的文件名
String downloadFileNama = "baihe0..jpg";
//2、读取要下载的文件内容(通过ServletContext对象可以读取)
ServletContext servletContext = getServletContext();
//获取要下载的文件的类型
String mimeType = servletContext.getMimeType("/file/" + downloadFileNama);
//通过响应头告诉客户端返回的数据类型
resp.setContentType(mimeType);
//告诉客户端收到的数据是用于下载使用(使用响应头)
//Content-Disposition 表示收到的数据怎么处理
//attachment 表示附件,表示下载使用
//filename= 表示指定下载的文件名
//URLEncoder.encode(downloadFileNama,"UTF-8") 解决中文下载名乱码的问题,url编码将汉字转换成%xx%xx的格式
resp.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(downloadFileNama,"UTF-8"));
InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileNama);
//获取响应的输出流
ServletOutputStream outputStream = resp.getOutputStream();
//读取输入流中的全部数据,复制给输出流,输出给客户端
//3、把下载的文件内容回传给客户端
IOUtils.copy(resourceAsStream, outputStream);
}
}
浙公网安备 33010602011771号