1.上传
本质就是将一台电脑中的文件根据网络协议通过io流传递到另外一台电脑(服务器)上
文件上传三个要素
1.表单提交方式为post
2.表单中需要文件上传项
3.enctype=multipart/form-data
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
描述:<input type="text" name="desc"/><br>
文件:<input type="file" name="file"/><br>
<button type="submit">上传</button>
</form>
文件上传代码实现
需要两个架包
网址:https://mvnrepository.com/
代码演示:
public class FileServlet 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 {
System.out.println("文件上传");
//创建磁盘文件项工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//获取核心解析对象
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//解决中文乱码问题
servletFileUpload.setHeaderEncoding("utf-8");
try {
List<FileItem> fileItems = servletFileUpload.parseRequest(req);
String description = null;
String fileName = null;
for (FileItem fileItem : fileItems) {
//获取每一个文件项 . 文字描述/文件数据
//确定是否没有FileItem实例代表一个简单的表单字段
//true如果实例表示一个简单的表格字段; false ,如果它代表一个上传的文件。
if (fileItem.isFormField()){
//以字符串形式返回文件项的内容,使用指定的编码。 此方法使用get()来检索项的内容
description = fileItem.getString("utf-8");
System.out.println(description);
} else {
InputStream inputStream = fileItem.getInputStream();
BufferedInputStream bis = new BufferedInputStream(inputStream);
String upload = req.getServletContext().getRealPath("upload");
System.out.println(upload);
File file = new File(upload);
//测试此抽象路径名表示的文件或目录是否存在。
if (! file.exists()){
file.mkdir();
}
fileName = System.currentTimeMillis() +"-" +fileItem.getName();
String path = upload + File.separator + fileName;
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path));
int len=-1;
byte[] bys = new byte[8192];
while ((len=bis.read(bys)) != -1){
bos.write(bys,0,len);
}
bis.close();
bos.close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
2.文件下载
本质就是将一台电脑(服务器)中的文件根据网络协议通过io流传递到另外一台电脑上。
代码演示
public class DownLoadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//文件下载:将服务器中的文件 拷贝到 本地电脑中!!!!
String fileName = request.getParameter("fileName");
//1,设置媒体类型
//文件存在本地电脑时,比如:a.txt
//文件存在服务器中,就需要用到媒体类型:
//获取下载文件对应的媒体类型
String mimeType = request.getServletContext().getMimeType(fileName);
System.out.println(mimeType);
//告诉浏览器,服务器给的是什么类型的数据
response.setContentType(mimeType);
//2,设置下载窗口:Content-Disposition
response.setHeader("Content-Disposition","attachement;filename="+fileName);
//3,io流读写
String inPath = request.getServletContext().getRealPath("upload") + File.separator + fileName;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inPath));
ServletOutputStream outputStream = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
int len = -1;
byte[] bys = new byte[8192];
while ((len = bis.read(bys)) != -1) {
bos.write(bys,0,len);
}
bis.close();
bos.close();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}