首先在我们开始这个任务时,我们需要2个jar包,我这里用的是 commons-fileupload-1.2.1.jar,commons-io-1.4.jar, 如果没有的话我这里可以提供下载。
链接:https://pan.baidu.com/s/1i_QItcsqdrtOZw7MpDg_OQ
提取码:8pei
1.上传功能
(1)首先我们要写一个表单,这个表单提交方法必须要是post方法 因为post方式 没有大小限制。
(2)这个表单的enctype属性必须要设置为multipart/form-data (意味分段发送数据) 应该是。
(3)每个input 必须要有name属性 表单的基本要求差不多是。
下面贴出代码,代码每一步都会有解释,一边看一边理解吧
package com.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;
/**
* @author fancy
* @date 2020/5/20 16:40
*/
public class loadServlet extends HttpServlet {
/**
* 文件上传功能
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if(ServletFileUpload.isMultipartContent(req)){
// 利用jar包的类创建文件处理工厂 别导错包了
FileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
// 以fileItemFactory的方式来处理提交的信息 并放回到 list 中
List<FileItem> list = servletFileUpload.parseRequest(req);
for(FileItem fileItem : list){ // 遍历每一个 list ifFormField()方法为是否是普通的表单项
if(fileItem.isFormField()){ // 是普通表单项
System.out.println( fileItem.getFieldName() ); // 输出这个表单项的 name属性值
System.out.println( fileItem.getString("UTF-8") ); // 输出这个表单项的 value 属性值 可能为中文 所以我们使用 UTF-8编码
}
else{ // 是文件
System.out.println( fileItem.getFieldName() ); // 输出这个表单项的 name属性值
System.out.println( fileItem.getName() ); // 输出这个文件的名字
fileItem.write(new File("D:\\Game\\"+ fileItem.getName())); // 将该文件上传到哪里
}
}
}catch (Exception E){
System.out.println(E);
}
}
}
}
2.下载功能
直接上代码,边看边理解
package com.servlet;
import org.apache.commons.io.IOUtils;
import sun.misc.BASE64Encoder;
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.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
/**
* @author fancy
* @date 2020/5/20 19:18
*/
public class download extends HttpServlet {
/**
* 文件下载功能
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取要下载的文件名 假设我们要下载的文件名是6.jpg 这个属性可以从提交的页面获取,这里放了方便就不写页面了
String downloadname = "6.jpg";
// 获取要下载的文件路径 并将文件转成流对象
ServletContext servletContext = getServletContext();
InputStream resourceAsStream = servletContext.getResourceAsStream("/img/" + downloadname); // servletContext.getResourceAsStream(这里写你这个文件的目录)
// 告诉客户端这个文件的类型
String mimeType = servletContext.getMimeType("/img/" + downloadname);
resp.setContentType(mimeType);
// 告诉客户端文件是被下载使用的
// Content-Disposition 表示文件要如何处理 attachment 表示文件用来做附件使用(即下载) filename 表示用户下载文件的名字
// 当下载的文件名字为中文时,会出现乱码 这个时候 我们要分别对不同浏览器进行处理 火狐使用base64编码 其他使用url编码
// 我们这个时候要获取浏览器信息 获取浏览器信息可以通过 User-Agent 来获取
if(req.getHeader("User-Agent").contains("Firefox"))
resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?"+ new BASE64Encoder().encode("编码问题.jpg".getBytes("UTF-8")) +"?=");
else
resp.setHeader("Content-Disposition","attachment;filename = "+ URLEncoder.encode("编码问题.jpg","UTF-8"));
// 获取要响应的流对象
ServletOutputStream outputStream = resp.getOutputStream();
// 通过copy将文件数据发送过去
IOUtils.copy(resourceAsStream,outputStream); // 利用jar包的类进行操作
}
}
自己也是边看视频边学的,萌新 有错误麻烦指出呀。