文件的上传和下载

本文介绍了文件上传和下载的场景和技术实现,包括前端HTML表单设置enctype属性,后端JavaServlet处理文件上传和下载请求。在上传过程中,使用multipart/form-data编码,解析请求数据,保存文件到服务器。下载时,设置响应头信息并输出文件内容。同时讨论了图片保存策略和数据库存储URL的方式。
摘要由CSDN通过智能技术生成

文件的上传和下载

上传的场景

  1. 网盘保存文件
  2. 上传头像(注册,修改)
    1. upload
    2. <img src="xxx">

下载的场景

  1. 获取网盘的文件
  2. 点击“下载”文件(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

小结文件上传:

  1. 修改请求的配置:
    enctype=“multipart/form-data”
    请求方式: post

  2. 引用第三方的接收上传数据的jar
    common-io.jar
    common-fileupload.jar

  3. 核心是利用第三方的包提供upload对象对request进行解析
    List fileItems = upload.parseRequest(request);

获取fileItems对象的前期操作

  1. 创建临时文件的目录
    File tempFile = new File(tempFilePath);
     

  2. 创建磁盘工厂
    DiskFileItemFactory factory = new DiskFileItemFactory(1024*100, tempFile);
     

  3. 创建操作的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();
    再进行文件的复制操作
     

  4. 细节操作

    1. 获取项目的“真实”路径
      String tempFilePath = getServletContext().getRealPath(“/WEB-INF/temp”);

    2. 目录的存在判断
      File tempFile = new File(tempFilePath);
      //判断在路径是否有temp文件夹,如果没有,就创建文件夹!
      if(!tempFile.exists()) {
      tempFile.mkdir();
      }

    3. 命名不重复
      思路3:

      1. 时间值Long
      2. UUID
      3. 人为地增加文件目录结构(用户,时间,后缀。。。)
         
  5. 路径(开发、部署、数据库、硬盘、配置文件) img src如何访问(临时文件)

示例

  1. 创建一个包含文件上传表单的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>
  1. 在Java Servlet中处理文件上传请求。您可以使用Servlet API中的HttpServletRequestPart对象来处理文件上传请求。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();
	}
}

功能

注册功能(含有上传图片), 服务器、数据库、硬盘、路径
上传图片后,立即回显,再点击“注册”
更新用户或查看所有用户的(显示图片 )

保存图片的方式

  1. (数据库直接保存)如果图片很大,
    一条记录的占用的空间就很大,多个记录数多。占用太多的存储空间。

  2. 数据库保存,其中一个字段保存“地址”。 地址,一般来说地址是url 的后缀(后面一部分)

d:/wang/webproject/resource/img/1231231.jpeg
img/1231231.jpeg
  1. <img src="url" >

客户端接收浏览器的数据,含有img,会内部会独立地发起src指定url的请求.
图片上传,可以上传到“别人家”(其他的网站),这个网站会为这个图片返回一个url
我们可以记住的这个url,把url发回!
视频!

示例

  1. 创建一个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()方法获取输出流,将文件输出到客户端。

  1. 在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中获取文件名并处理文件下载请求。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奕の辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值