文件上传该注意的问题

文件上传该注意的基本问题:


(1)必须使用POST表单;


(2)表单的enctype必须是multipart/form-data;


(3)需要在表单中添加file表单字段,即


(4)request.getParameter(String)方法失效,因为request.getParameter(String)方法获取指定的表单字段字符内容,但文件上传表单已经不在是字符内容,而是字节内容;


(5)可以使用request的getInputStream()方法获取ServletInputStream对象,它是InputStream的子类,这个ServletInputStream对象对应整个表单的正文部分(从第一个分隔线开始,到最后),这说明我们需要的解析流中的数据。当然解析它是很麻烦的一件事情。


(6)确定我们需要使用fileupload来对request.getInputStream()的内容进行解析!commons-fileupload是由apache的commons组件提供的上传组件,它最主要的工作就是帮我们解析request.getInputStream()。

fileupload组件需要的JAR包有:
------commons-fileupload.jar,核心包;
------commons-io.jar,依赖包。

fileupload的核心类有:DiskFileItemFactory,ServletFileUpload,FileItem。


————————————————————————————————————————————————

————————————————————————————————————————————————


文件上传该注意的细节问题:


(7)把上传的文件放到WEB-INF目录下;如果没有把用户上传的文件存放到WEB-INF目录下,那么用户就可以通过浏览器直接访问上传的文件,这是非常危险的。


(8)上传文件名称可能是完整路径;使用不同浏览器测试,其中IE6就会返回上传文件的完整路径,就是需要处理这一问题。处理这一问题也很简单,无论是否为完整路径,我们都去截取最后一个“\\”后面的内容就可以了。


(9)中文乱码问题;
上传文件名称中包含中文:
当上传的谁的名称中包含中文时,需要设置编码,commons-fileupload组件为我们提供了两种设置编码的方式:
------request.setCharacterEncoding(String):这种方式是我们最为熟悉的方式了;
------fileUpload.setHeaderEncdoing(String):这种方式的优先级高与前一种。
上传文件的文件内容包含中文:
通常我们不需关心上传文件的内容,因为我们会把上传文件保存到硬盘上!也就是说,文件原来是什么样子,到服务器这边还是什么样子!
但是如果你有这样的需求,非要在控制台显示上传的文件内容,那么你可以使用fileItem.getString(“utf-8”)来处理编码。


(10)上传文件同名问题;使用uuid来解决,在每个文件前加uuid;


(11)一个目录不能存放过多的文件;


(12)限制单个上传文件的大小;使用ServletFileUpload类的setFileSizeMax(long)就可以了。参数就是上传文件的上限字节数,例如servletFileUpload.setFileSizeMax(1024*10)表示上限为10KB。


(13)上传文件的总大小限制;使用ServletFileUpload类的setSizeMax(long)方法即可;


(14)设置缓存大小与临时目录;

DiskFileItemFactory dfif = new DiskFileItemFactory(1024*20, new File("F:\\temp"));
ServletFileUpload fileUpload = new ServletFileUpload(dfif);

fileupload会判断文件大小是否超出20KB,如果是那么就把文件保存到临时目录temp上,如果没有超出,那么就保存在内存中。


————————————————————————————————————————————————

————————————————————————————————————————————————


文件上传实例:


相关jar包:

文件上传该注意的问题_第1张图片

jsp页面:



上传代码:

	public String add() throws UnsupportedEncodingException {
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		
		//request.setCharacterEncoding("utf-8");
		
		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload sfu = new ServletFileUpload(factory);
		sfu.setFileSizeMax(2048 * 2048);

		try {
			List fileItemList = sfu.parseRequest(request);
			Map map = new HashMap();
			for (FileItem fileItem : fileItemList) {
				if (fileItem.isFormField()) {
					map.put(fileItem.getFieldName(),
							fileItem.getString("UTF-8"));
				}
			}
			post = CommonUtils.toBean(map, Post.class);
			post.setPid(CommonUtils.uuid());
			User user = (User) request.getSession().getAttribute("sessionUser");
			post.setUser(user);
			post.setPtime(new Date());

			// 得到保存的目录
			String savepath = ServletActionContext.getServletContext()
					.getRealPath("/post_img");
			// 得到文件名称:给原来文件名称添加uuid前缀!避免文件名冲突
			String filename = CommonUtils.uuid() + "_"
					+ fileItemList.get(3).getName();

			/*
			 * 校验文件的扩展名
			 */
			if (!filename.toLowerCase().endsWith("jpg")) {
				request.setAttribute("msg", "您上传的图片不是JPG扩展名!");
				return "posting";
			}

			// 使用目录和文件名称创建目标文件
			File destFile = new File(savepath, filename);
			// 保存上传文件到目标文件位置
			fileItemList.get(3).write(destFile);
			post.setPimg("post_img/" + filename);
			postService.add(post);
		} catch (Exception e) {
			if (e instanceof FileUploadBase.FileSizeLimitExceededException) {
				request.setAttribute("msg", "您上传的文件超出了1024KB");
				return "posting";
			}
		}

		return findByStatus();
	}

转载于:https://www.cnblogs.com/Arry10/p/7731790.html

你可能感兴趣的:(文件上传该注意的问题)