文件的上传
如何上传文件
- 要有一个form标签,method=post请求(因为post请求没有长度限制)
- form标签的enctype属性值必须为multipart/form-data值(表示提交的数据以多段的形式进行拼接,然后以二进制流的形式发送给服务器)
- 在form标签中使用input type=file添加上传的文件
- 编写服务器代码(Servlet程序)接收,处理上传的数据(要使用流的形式接收)
代码实现
- 创建一个上传的jsp页面,命名为upload.jsp
<%--
Created by IntelliJ IDEA.
User: ningqian
Date: 2021/5/12
Time: 9:11
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
<base href="">
</head>
<body>
<form action="http://localhost:8080/jsp/upload" ENCTYPE="multipart/form-data" method="post">
用户名:<input type="text" name="username"/><br/>
头像:<input type="file" name="photo"/><br/>
<input type="submit"><br/>
</form>
</body>
</html>
- 导入文件上传所依赖的jar包
下载地址:
https://wwa.lanzous.com/ibmdfp1pkri - 编写servlet程序接收来自客户端的请求输入流
package com.jspDemo.jsp;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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 UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("服务器收到了用户上传的文件");
req.setCharacterEncoding("UTF-8");
if (ServletFileUpload.isMultipartContent(req)){
FileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
List<FileItem> list = servletFileUpload.parseRequest(req);
for(FileItem item:list){
if(item.isFormField()){
String fieldName = item.getFieldName();
System.out.println("表单的name属性值:"+fieldName);
System.out.println("表单的value属性值:"+item.getString("UTF-8"));
}else{
String fieldName = item.getFieldName();
System.out.println("表单的name属性值:"+fieldName);
String itemName = item.getName();
System.out.println("上传的文件名:"+itemName);
item.write(new File("E:\\Job\\Java\\JavaWeb\\"+itemName));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
- 浏览器输入网址:http://localhost:8080/jsp/upload.jsp
填写表单内容,提交

- 查看服务器的输出结果

此时在磁盘对应的位置也保存下来上传的文件
文件的下载
- 在web-app目录下创建一个img目录,放上一个命名为1的图片
- 创建一个Servlet程序,处理客户端发来的文件下载请求,同时配置web.xml信息
package com.jspDemo.jsp;
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.IOException;
import java.io.InputStream;
public class Download extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String fileName = "1.jpg";
ServletContext servletContext = getServletContext();
String mimeType = servletContext.getMimeType("/img" + fileName);
System.out.println("文件类型:"+mimeType);
resp.setContentType(mimeType);
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("尹昔眠.jpg","UTF-8"));
InputStream resourceAsStream = servletContext.getResourceAsStream("/img/" + fileName);
ServletOutputStream outputStream = resp.getOutputStream();
IOUtils.copy(resourceAsStream,outputStream);
}
}
<servlet>
<servlet-name>Download</servlet-name>
<servlet-class>com.jspDemo.jsp.Download</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
- 启动服务器,在浏览器输入访问地址,即在web.xml中配置的地址
http://localhost:8080/jsp/download