文件的上传和下载
上传的场景
- 网盘保存文件
- 上传头像(注册,修改)
- upload
<img src="xxx">
下载的场景
- 获取网盘的文件
- 点击“下载”文件(excel, word, img…)
技术
java web
发送http访问 (url, 请求方式, 参数) ?username=admin&password=123
参数以键值对(字符串)
服务端
String value = request.getParameter(key);
如果是上传文件,键是什么,值是什么?
感觉通过键值对的方式发送,可以上传文件吗?
String username = request.getParameter(“username”);
上传文件,服务端需要接收到什么?流!
原始的方式:
request.getInputStream()
获取请求的输入流对象
对这个请求输入流进行操作可以获取请求的数据(包含文件,参数键值对,额外提供一些其他的信息)
如果我们“自己”解析这些数据,非常麻烦!
有人帮忙做, 我们只要按照提供的方式解决!
上传文件,前端的表单需要设置:
在form标签中添加:enctype=“multipart/form-data” 属性
默认:enctype=“application/x-www-form-urlencoded”
这个属性的含义,告诉浏览器,我要上传文件(不是简单键值对参数),
浏览器就会“额外提供一些其他的信息”发送
需要导入jar
common-io
common-upload
小结文件上传:
-
修改请求的配置:
enctype=“multipart/form-data”
请求方式: post -
引用第三方的接收上传数据的jar
common-io.jar
common-fileupload.jar -
核心是利用第三方的包提供upload对象对request进行解析
List fileItems = upload.parseRequest(request);
获取fileItems对象的前期操作
-
创建临时文件的目录
File tempFile = new File(tempFilePath);
-
创建磁盘工厂
DiskFileItemFactory factory = new DiskFileItemFactory(1024*100, tempFile);
-
创建操作的upload对象
ServletFileUpload upload = new ServletFileUpload(factory);
获取fileItems对象的后续操作,遍历FileItem元素
判断FileItem元素是参数键值对,还是文件
item.isFormField()如果是参数键值对,一样可以获取键值对
String key = item.getFieldName();
String value = item.getString();如果是文件,获取输入流对象
InputStream in = new BufferedInputStream(item.getInputStream());
获取上传文件名称
String fileName = item.getName();
再进行文件的复制操作
-
细节操作
-
获取项目的“真实”路径
String tempFilePath = getServletContext().getRealPath(“/WEB-INF/temp”); -
目录的存在判断
File tempFile = new File(tempFilePath);
//判断在路径是否有temp文件夹,如果没有,就创建文件夹!
if(!tempFile.exists()) {
tempFile.mkdir();
} -
命名不重复
思路3:- 时间值Long
- UUID
- 人为地增加文件目录结构(用户,时间,后缀。。。)
-
-
路径(开发、部署、数据库、硬盘、配置文件) img src如何访问(临时文件)
示例
- 创建一个包含文件上传表单的HTML页面。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<label for="file">选择文件:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
- 在Java Servlet中处理文件上传请求。您可以使用Servlet API中的
HttpServletRequest
和Part
对象来处理文件上传请求。HttpServletRequest
对象提供了对HTTP请求的访问,而Part
对象则表示上传的文件部分。在Java 8及以上版本中,您可以使用getParts()
方法来获取所有文件部分。在Java 7及以下版本中,您可以使用getPart()
方法来获取单个文件部分。
@WebServlet("/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取上传的文件
Part filePart = request.getPart("file");
String fileName = filePart.getSubmittedFileName();
// 将文件保存到指定目录
String savePath = "D:/upload";
File saveDir = new File(savePath);
if (!saveDir.exists()) {
saveDir.mkdir();
}
String filePath = savePath + File.separator + fileName;
filePart.write(filePath);
// 响应上传结果
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("文件上传成功:" + filePath);
out.close();
}
}
功能
注册功能(含有上传图片), 服务器、数据库、硬盘、路径
上传图片后,立即回显,再点击“注册”
更新用户或查看所有用户的(显示图片 )
保存图片的方式
-
(数据库直接保存)如果图片很大,
一条记录的占用的空间就很大,多个记录数多。占用太多的存储空间。 -
数据库保存,其中一个字段保存“地址”。 地址,一般来说地址是url 的后缀(后面一部分)
d:/wang/webproject/resource/img/1231231.jpeg
img/1231231.jpeg
<img src="url" >
客户端接收浏览器的数据,含有img,会内部会独立地发起src指定url的请求.
图片上传,可以上传到“别人家”(其他的网站),这个网站会为这个图片返回一个url
我们可以记住的这个url,把url发回!
视频!
示例
- 创建一个Servlet来处理文件下载请求。
@WebServlet("/download")
public class FileDownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取要下载的文件名
String fileName = request.getParameter("fileName");
// 设置文件MIME类型
response.setContentType("application/octet-stream");
// 设置Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// 读取要下载的文件,然后输出到客户端
String filePath = "D:/upload/" + fileName;
InputStream in = new FileInputStream(filePath);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
在这个Servlet中,我们首先获取要下载的文件名,然后设置响应的MIME类型和
Content-Disposition
。接着,我们使用FileInputStream
读取要下载的文件,然后使用HttpServletResponse.getOutputStream()
方法获取输出流,将文件输出到客户端。
- 在JSP页面上添加一个下载链接。
<a href="/download?fileName=example.pdf">下载</a>
IME类型和Content-Disposition
。接着,我们使用FileInputStream
读取要下载的文件,然后使用HttpServletResponse.getOutputStream()
方法获取输出流,将文件输出到客户端。
2. 在JSP页面上添加一个下载链接。
<a href="/download?fileName=example.pdf">下载</a>
在这个链接中,我们将要下载的文件名作为参数传递给Servlet,然后在Servlet中获取文件名并处理文件下载请求。