JSP文件上传

撰写时间:2019年08月18日

JSP可以通过HTML的form表单上传文件到服务器。 文件类型可以是文本文件、二进制文件、图像文件等其他任何文档。
创建文件上传表单
接下来我们使用HTML标签来创建文件上传表单,以下为要注意的点:

  • form表单 method 属性必须设置为 POST 方法 ,不能使用GET 方法。form表单 enctype 属性需要设置为 multipart/form-data。
  • form表单 action 属性需要设置为提交到后台处理文件上传的jsp文件地址。例如 uploadFile.jsp 程序文件用来处理上传的文件。
  • 上传文件元素需要使用 <input …/> 标签,属性设置为 type=“file”。如果需要上传多个文件,可以在 <input …/>标签中设置不同的名称。

一个上传文件的表单,实例如下:

<form id="fmPersonalDetails" action="${ctx}/servlet/myAccountServlet" method="post" enctype="multipart/form-data" autocomplete="off">
	<img src="" alt="" width="150" height="180" id="InsertUserImg" />
	<input type="file" style="margin-left:90px;margin-top:5px;display: none" name="IStudentPicture" id="IStudentPicture" />
	<p class="text-center">上传的图片上限大小为10M!</p>
</form>

显示界面如下所示,在你点击"图片框"会弹出一个窗口让你选择要上传的文件:
在这里插入图片描述
后台数据处理:
因为form表单 enctype 属性需要设置为 multipart/form-data。
所以先写个判断,是否设置了该属性

private void insertFile(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	JsonReturn jsonReturn=new JsonReturn();
	jsonReturn.setState(false);
	//判断请求头中是否含有 enctype="multipart/form-data"
	if (!ServletFileUpload.isMultipartContent(request)) {
		jsonReturn.setMsg("Error:表单中必须包含enctype=\"multipart/form-data\"");
	}else{
		int sizeThreshold=1025*1024*5;//设置内存临界值 5M
		int fileSizeMax=1025*1024*5;//设置单个文件的最大大小
		int sizeMax=1025*1024*11;//设置请求的最大大小
		DiskFileItemFactory factory=new DiskFileItemFactory();
		//当文件超过设置的值时就写入到临时文件夹中,否则就保存在内存
		factory.setSizeThreshold(sizeThreshold);
		//设置DiskFileItemFactory的临时文件夹
		//java.io.tmpdir 代表系统的temp目录
		factory.setRepository(new File(System.getProperty("java.io.tmpdir")));	
		ServletFileUpload upload =new ServletFileUpload(factory);
		//设置编码
		upload.setHeaderEncoding("utf-8");
		//设置单个文件的最大大小
		upload.setFileSizeMax(fileSizeMax);
		//设置请求的最大大小
		upload.setSizeMax(sizeMax);
		//构建上传目录的路径
		String uploadPath="D:\\TotalUploadFile\\ecolp\\upload";
		//如果目录不存在就创建
		File uploadDir=new File(uploadPath);
		if (!uploadDir.exists()) {//判断是否存在
			uploadDir.mkdirs();//多层目录
		}
		try {
			List<FileItem>fileItems=upload.parseRequest(request); fileItems:文件都在
			for (FileItem fileItem : fileItems) {//遍历一个的取
				//文件元素
				if ("IStudentPicture".equals(fileItem.getFieldName())) {
					//获取文件名
					String oldName=new File(fileItem.getName()).getName();
					String extensionName=".jpg";
					//获取扩展名
					if ((oldName!=null)&&(oldName.length()>0)) {
						int dot=oldName.lastIndexOf('.');
						if ((dot>-1)&&(dot<(oldName.length()-1))) {
							extensionName=oldName.substring(dot);
						}
					}
					//构建文件名称
					String fileName=System.currentTimeMillis()+"_"+System.nanoTime()+extensionName;
					String filePath=uploadPath+File.separator+fileName;
					//保存文件到盘
					try {
						fileItem.write(new File(filePath));
					} catch (Exception e) {
						e.printStackTrace();
					}
					//保存文件名称到数据库
					...
				}
			}
		}catch (FileUploadException e) {
			e.printStackTrace();
			jsonReturn.setMsg("服务器异常,请稍后再试");
		}
	}
	response.setCharacterEncoding("utf-8");
	JSONObject jsonObject=JSONObject.fromObject(jsonReturn);		
	PrintWriter out=response.getWriter();
	out.write(jsonObject.toString());
	out.close();
}

以下脚本文件UploadFile.jsp可以处理多个上传的文件,在使用该脚本前,我们需要注意以下几点:

  • 以下实例依赖 FileUpload, 所以你需要在你的classpath中引入最新的 commons-fileupload.x.x.jar包文件。
    下载地址为:http://commons.apache.org/fileupload/。
  • FileUpload 依赖 Commons IO, 所以你需要在你的classpath中引入最新的 commons-io-x.x.jar 。 下载地址为: http://commons.apache.org/io/。
  • 在测试以下实例时,你需要上传确认上传的文件大小小于 maxFileSize 变量设置的大小 ,否则文件无法上传成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值