javaweb文件上传servlet

javaweb文件上传servlet

package com.example.file; /**
 * @author 衡赞
 * @version 1.0
 * 2023/2/26  17:04
 */

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

@WebServlet(name = "FileServlet", value = "/FileServlet")
public class FileServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//判断上传的文件是普通表单还是带文件的表单
		if (!ServletFileUpload.isMultipartContent((RequestContext) request)) {
			return;//终止方法运行,说明这是一个普通表单
		}
		//创建上传文件的保存路径,建议在WEB-INF路径下,安全,用户无法直接访问上传的文件
		String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
		File uploadFile = new File(uploadPath);
		if (!uploadFile.exists()) {
			uploadFile.mkdir();//创建这个目录
		}
		//缓存,临时文件
		String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");
		File tmpFile = new File(tmpPath);
		if (!tmpFile.exists()) {
			uploadFile.mkdir();//创建这个目录
		}

		//处理上传的文件,一般都需要通过流来获取,我们可以使川request.getInputStream(),原生态的文件上传流获取,十分麻烦
		//但是我们都建议使用Apache的文件上传组件来实现,common-fileupload,它需要依赖于 commons-io组件;
		//1.创建DiskFileItemFactory对象,处理文件路径上传或者大小限制的
		DiskFileItemFactory factory = createDiskFileItemFactory(tmpFile);
		//2.获取ServletFileUpload
		ServletFileUpload upload = creatServletFileUpload(factory);
		//3.处理上传的文件
		String msg = null;
		try {
			msg = uploadFile(request, uploadPath, upload);
		} catch (FileUploadException e) {
			e.printStackTrace();
		}

		//转发
		request.setAttribute("msg", msg);
		request.getRequestDispatcher("/info.jsp").forward(request, response);

	}

	private String uploadFile(HttpServletRequest request, String uploadPath, ServletFileUpload upload) throws IOException, FileUploadException {
		String msg = "";
		//把前端请求解析,封装成一个FileItem对象,需要从ServletFileUpload对象中获取
		try {
			List<FileItem> fileItems = upload.parseRequest((RequestContext) request);
			for (FileItem fileItem : fileItems) {
				if (fileItem.isFormField()) {
					String fieldName = fileItem.getFieldName();
					//处理乱码
					String value = fileItem.getString("UTF-8");
					System.out.println(fieldName + ":" + value);
				} else {
					//文件
					//===========处理文件============
					String uploadFileName = fileItem.getName();
					System.out.println("uploadFileName:" + uploadFileName);
					//可能存在文件名不合法的情况
					if (uploadFileName == null || "".equals(uploadFileName.trim())) {
						continue;
					}
					//获取上传的文件名
					String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
					//获取文件的后缀名
					String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
					//如果文件后缀名fileExtName不是我们所需要的,就直接return,不处理,告诉用户文件类型不对

					//可以使用UUID(统一识别的通用码),保证文件名唯一
					//UUID.randomUUID() 随机生一个唯一识别的通用码
					//网络从传输中的东西,都需要序列化
					//implements java.io.Serializable 标记接口  本地方法栈--》C++
					String uuidPath = UUID.randomUUID().toString();

					//===========存放地址============
					String realPath = uploadPath + "/" + uuidPath;
					File realPathFile = new File(realPath);
					if (!realPathFile.exists()) {
						realPathFile.mkdir();
					}
					//===========文件传输============
					InputStream inputStream = fileItem.getInputStream();
					FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);
					byte[] buffer = new byte[1024 * 1024];
					int len = 0;
					while ((len = inputStream.read(buffer)) > 0) {
						fos.write(buffer, 0, len);
					}
					fos.close();
					inputStream.close();
					msg = "上传成功~";
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
			msg = "上传失败~";
		}
		return msg;
	}

	private ServletFileUpload creatServletFileUpload(DiskFileItemFactory factory) {
		ServletFileUpload upload = new ServletFileUpload(factory);
		//监听文件上传进度
		upload.setProgressListener(new ProgressListener() {
			/**
			 *
			 * @param pBytesRead 已经读取到的文件大小
			 * @param pContentLength 文件总大小
			 * @param pItems
			 */
			@Override
			public void update(long pBytesRead, long pContentLength, int pItems) {
				System.out.println("总大小:" + pContentLength + "已经上传:" + pBytesRead);
			}
		});
		//处理乱码问题
		upload.setHeaderEncoding("UTF-8");
		//设置单个文件的最大值
		upload.setFileSizeMax(1020 * 1024 * 10);
		//设置总共能够上传文件的大小
		//1020 = 1kb * 1024 = 1M * 10 = 10M
		upload.setSizeMax(1020 * 1024 * 10);
		return upload;
	}

	private DiskFileItemFactory createDiskFileItemFactory(File tempFile) {
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将他放到临时文件中
		//缓冲区大小为1M
		factory.setSizeThreshold(1024 * 1024);
		//临时目录的保存目录
		factory.setRepository(tempFile);
		return factory;
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值