文件上传组件

前提条件:

1 上传的前提首要条件,在上传的之前需要把form表单的ectype设置成为multipart/form-data

2 使用Apache 的fileupload上传组件,需要用到commons-io-2.0.1-bin的jar包,需要提前引入

fileupload上传组件的流程原理。


<FileUpLoad> 文件上传组件_第1张图片

1. 每一个提交的request都会别servletfileupload解析, 解析的时候,会先判断,request中是否为包含的上传的内容。servletfileupload需要通过一个 DiskFileItemFactory来初始化设置对象。

2.对于form表单中提交过来的数据,  servletFileupload都会将其解析成一个一个的FileItem的项, 可以通过for循环,来遍历每一项。 对于每一项,如果是字段,可以通过isFormField来判断。

并通过getString(“utf-8”)来获取到上传的普通字段中的值。

代码示例:

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 判断是否是正确的form格式
		boolean isUpload = ServletFileUpload.isMultipartContent(request);
		// 文件存储的根目录
		String fileStore = getServletContext().getRealPath("/WEB-INF/files");
		if (!isUpload) {
			response.getWriter().write("不是正确的上传格式");
			response.getWriter().write(request.getContentType());
			return;
		}
		// 是正确的上传格式
		try {
			// 设置临时目录
			File tempFile = new File(getServletContext().getRealPath(
					"/WEB-INF/temp"));
			if (!tempFile.exists()) // 如果临时目录不存在,则创建临时目录
				tempFile.mkdir();
			DiskFileItemFactory fif = new DiskFileItemFactory();
			// 设置临时文件大小。
			fif.setSizeThreshold(1024 * 50);
			// 设置临时目录
			fif.setRepository(tempFile);
			ServletFileUpload servletUpload = new ServletFileUpload(fif);
			// 设置单个文件上传大小限制500MB
			servletUpload.setFileSizeMax(1024 * 1024 * 1024);
			// 设置总文件大小限制
		        servletUpload.setSizeMax(1024*1024*1024);
			List<FileItem> filesItem = servletUpload.parseRequest(request);
			for (FileItem fileItem : filesItem) {
				// 如果上传是普通字段
				if (fileItem.isFormField()) {
					if(fileItem.getString()==null||fileItem.getString().equals("")){
						continue;
				          //如果字段为空,我就跳过这次循环,不访问了。
					}
					System.out.println("isFormField");
					System.out.println(fileItem.getFieldName() + ":"
							+ fileItem.getString("UTF-8"));
				} else {
					// 如果上传是流是空的没有,东西的话,则文件名称是空的。所以可以直接返回了。
					if (fileItem.getName() == null||fileItem.getName().equals("")) {
						response.getWriter().write(
								("<h1>你还没有给我选择文件就上传,两秒后自动跳回去!<h1>"));
						response.setHeader("Refresh", "2;URL=/Upload");
						return;
					}
					// 如果上传的不是视频,鉴别格式的。
//					if (!fileItem.getContentType().startsWith("video")) {
//						response.getWriter().write(
//								("<h1>你玩我呢?跳回去重新给我上传,两秒后自动跳转!<h1>"));
//						response.setHeader("Refresh", "3;URL=/day21Upload");
//						return;
//					}

					InputStream inStream = fileItem.getInputStream();
					String fileName = fileItem.getName();
					// 截取文件名
					fileName = fileName
							.substring(fileName.lastIndexOf("\\") + 1);
					fileStore = makeStore(fileStore, fileName);
					// 改写文件名,确定上传的绝对路径
					fileStore = fileStore + "\\" + UUID.randomUUID() + "_"
							+ fileName;
					OutputStream outStream = new FileOutputStream(new File(
							fileStore));
					byte b[] = new byte[1024 * 1024];
					int len = -1;
					while (!((len = inStream.read(b)) == -1)) {
						outStream.write(b, 0, len);
					}
					outStream.flush();
					inStream.close();
					outStream.close();
					fileItem.delete(); // 删除临时文件,一定要在流关闭以后。
					response.getWriter().write("正在上传成功,马上跳回主页!");
					response.setHeader("Refresh", "2;URL=/Upload");
				}

			}

		} catch (org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException e) {
			response.getWriter().write("单个文件大于了500mb请重新选择");

		} catch (org.apache.commons.fileupload.InvalidFileNameException e) {

		} catch (Exception e) {
			// TODO Auto-generated catch block
			response.getWriter().write("反正是不想给你上传,你打我啊啊?! ");

			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}


你可能感兴趣的:( 文件上传组件)