java实现文件上传

本文介绍了在Java中如何实现文件上传。重点指出,由于文件大小限制,不适合使用GET方式提交,而应该使用POST方式。在HTML表单提交时,需要设置enctype属性为"multipart/form-data",以确保文件完整上传,不会因编码导致丢失。同时,提到了在Servlet和JSP层处理文件上传的简单实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

文件上传:
        1、上传文件相对较大不能使用get方式提交[get在url地址中携带数据,数据大小有显示,post没有限制]
        2、form表单在提交数据时,默认会对表单中数据进行编码再提交给服务器[enctype="application/x-www-form-urlencoded"]
            如果form表单上传文件,不能对表单中的文件进行编码,如果编码会造成文件丢失[enctype="multipart/form-data"]

 

 

 

servlet层 

package com.atguigu.servlet;

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

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

/**
 */
public class RegistServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		
		// 获取文件的真实路径
		ServletContext context = getServletContext();
		String realPath = context.getRealPath("/upload");// 在项目根目录下查找upload文件夹的真实路径
		File file = new File(realPath);
		if (!file.exists()) {
			// 如果upload文件夹不存在则创建一个
			file.mkdirs();
		}
		// fileUpload: 必须依赖commons-io
		// 使用步骤:1、导包
		// 2、创建一个工厂类
		DiskFileItemFactory itemFactory = new DiskFileItemFactory();
		// 3、根据工厂类对象创建解析器对象[将浏览器传过来的流解析成一个个的表单项,根据表单项对象的属性判断是普通文本还是文件]
		ServletFileUpload fileUpload = new ServletFileUpload(itemFactory);
		// 设置文件大小限制 限制单个文件大小为20k
		fileUpload.setFileSizeMax(508 * 1024);
		// 限制上传文件的总大小
		fileUpload.setSizeMax(500 * 1024);
		// 4、使用解析器对象解析请求报文
		try {
			// 解析时会判断文件的大小
			List<FileItem> list = fileUpload.parseRequest(request);
			// FileItem 代表一个表单项
			for (FileItem fileItem : list) {
				/*
				 * System.out.println("表单项name属性值:"+fileItem.getFieldName());
				 * System.out.println("文件名-:"+fileItem.getName());
				 * System.out.println("表单数据大小:"+fileItem.getSize());
				 * System.out.println("表单项value属性值:"+fileItem.getString("UTF-8")
				 * ); System.out.println("文件类型-:"+fileItem.getContentType());
				 * //如果true:代表是一个普通表单项,如果为false代表是一个文件表单项
				 * System.out.println("是否为表单项:"+fileItem.isFormField());
				 * System.out.println("---------------------------------------")
				 * ;
				 */
				if (fileItem.isFormField()) {
					// 普通文本项
					System.out.println("表单项value属性值:" + fileItem.getString("UTF-8"));
				} else {
					if (fileItem.getSize() > 10) {
						// 文件表单项
						// 将文件保存到本地[文件名不能随意,需要使用一个唯一的名字,如果文件名相同会被覆盖]
						// 使用UUID拼接文件名
						String uuid = UUID.randomUUID().toString().replace("-", "");
						String fileName = fileItem.getName();
						fileName = uuid + "_" + fileName;
						// 参数1:文件夹的路径 参数2:要保存的文件名
						File f = new File(file, fileName);
						try {
							fileItem.write(f);
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
			}
		} catch (FileSizeLimitExceededException e) {
			// 给出提示,单个文件大小不能超过20k
			response.getWriter().write("单个文件不能超过20k");
		} catch (SizeLimitExceededException e) {
			// 给出提示,总文件大小不能超过60k
			response.getWriter().write("总文件大小不能查过60k");
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

简单的jsp层

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
	文件上传:
		1、上传文件相对较大不能使用get方式提交[get在url地址中携带数据,数据大小有显示,post没有限制]
		2、form表单在提交数据时,默认会对表单中数据进行编码再提交给服务器[enctype="application/x-www-form-urlencoded"]
			如果form表单上传文件,不能对表单中的文件进行编码,如果编码会造成文件丢失[enctype="multipart/form-data"]
  -->
	<form enctype="multipart/form-data" action="${pageContext.request.contextPath }/RegistServlet" method="post">
		用户名:<input type="text" name="username"/><br/>	
		密码:<input type="text" name="password"/><br/>	
		生活照1:<input type="file" name="photo1"/><br/>	
		生活照2:<input type="file" name="photo2"/><br/>	
		生活照3:<input type="file" name="photo3"/><br/>	
		<input type="submit" value="注册"/>
	</form>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值