文件的上传与下载

文件的上传与下载

文件的上传和下载是非常常见的功能。在很多系统或者软件中都经常使用文件的上传和下载。

文件的上传(重点)

上传文件步骤

  1. 有一个form标签,method=post请求
  2. form标签的encType属性值必须为multipart/form-data
  3. form标签中使用input type=file添加需要上传的文件
  4. 编写(Servlet程序)服务器代码接收,处理上传的数据

encType=mulipart/form-data 表单提交的数据,以多端(每一个表单项一个数据段)形式进行拼接,然后以二进制流的形式发送给服务器在这里插入图片描述

这里还需要导入两个jar包:

  1. commons-fileupload-1.2.1.jar https://nowjava.com/jar/detail/m05126985/commons-fileupload-1.2.1.jar.html
  2. commons-io-1.4.jar https://nowjava.com/jar/detail/m02261680/commons-io-1.4.jar.html

代码演示

UploadServlet.java

package code;

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;

/**
 * @BelongsProject: JavaWeb
 * @BelongsPackage: UploadServlet
 * @Author: HeXin
 * @CreateTime: 2023/2/2  21:57
 * @Description: 文件的上传与下载
 * @Version: 1.0
 */
public class UploadServlet extends HttpServlet {
	/**
	 * @Description: 用来处理文件上传的数据
	 * @CreateTime:2023/2/2 21:58
	 * @Author:HeXin
	 */
	@Override
	protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//判断上传的数据是否是多端数据(只有多端的数据,才是文件上传的)
		if(ServletFileUpload.isMultipartContent(req)){
			//创建FileItemFactory工厂实现类
			FileItemFactory fileItemFactory = new DiskFileItemFactory();
			//创建用于解析上传数据的工具类
			ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
			//解析上传的数据,得到每一个表单项FileItem
			try {
				List<FileItem> list = upload.parseRequest(req);
				//循环判断每一个表单项是否是上传的文件
				for (FileItem fileItem : list) {
					if(fileItem.isFormField()){
						//普通表单项
						System.out.println("表单项的name属性值:"+fileItem.getFieldName());
						System.out.println("表单的value属性值:"+fileItem.getString("UTF-8"));
					}else{
						//上传的文件
						System.out.println("表单项的name属性值:"+fileItem.getFieldName());
						System.out.println("上传的文件名:"+fileItem.getName());
						fileItem.write(new File("E:\\"+fileItem.getName()));
					}
				}
			} catch (FileUploadException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

upload.jsp

<%--
  Created by IntelliJ IDEA.
  User: He
  Date: 2023/2/2
  Time: 21:51
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="http://localhost:8080/EL/upload" method="post" enctype="multipart/form-data" >
        用户名:<input type="text" name="username" /> <br/>
        头像:<input type="file" name="photo"><br/>
        <input type="submit" value="上传">
    </form>
</body>
</html>

web.xml

<servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>code.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/upload</url-pattern>
</servlet-mapping>

文件下载

Download.java

package code;

import org.apache.commons.io.IOUtils;
import sun.misc.BASE64Decoder;
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;

/**
 * @BelongsProject: JavaWeb
 * @BelongsPackage: Download
 * @Author: HeXin
 * @CreateTime: 2023/2/3  8:51
 * @Description:
 * @Version: 1.0
 */
public class Download extends HttpServlet {
	@Override
	protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获取下载的文件名
		String fileName = "1.png";
		//读取要下载的文件内容
		ServletContext servlet = getServletContext();
		//获取要下载的文件类型
		String mimeType = servlet.getMimeType("/" + fileName);
		//在回传前,通过响应头告诉客户端返回的数据类型
		resp.setContentType(mimeType);
		//使用响应头告诉客户端收到的数据用于下载
		if(req.getHeader("User-Agent").contains("Firefox")){//如果是火狐浏览器,则使用Base64编码
			resp.setHeader("Content-Disposition","attachment;filename=?UTF-8?"+
					new BASE64Encoder().encode("动漫.jsp".getBytes("UTF-8"))+"?=");
		}else{//如果不是火狐,则用URL编码
			resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("动漫.jpg","UTF-8"));
		}
		//斜杠被服务器解析表示地址为http://ip:port/工程名/ 映射到代码的web目录
		InputStream inputStream = servlet.getResourceAsStream("/" + fileName);
		//获取响应的输出流
		ServletOutputStream outputStream = resp.getOutputStream();
		//读取输入流的内容,复制到输出流,并输出给客户端
		IOUtils.copy(inputStream, outputStream);
	}
}

web.xml

<servlet>
    <servlet-name>Download</servlet-name>
    <servlet-class>code.Download</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Download</servlet-name>
    <url-pattern>/download</url-pattern>
</servlet-mapping>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值