Java 原生服务器接收上传文件,不使用MultipartFile类

版权声明:借鉴时注明出处就行 https://blog.csdn.net/weixin_42144379/article/details/85333023

由于工作中 使用 MultipartFile 与现有的一些上传文件组件冲突

所以使用其他的接收上传文件的方法.

首先我把 MultipartFile 类的配置文件注释掉.

<!-- <bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="utf-8" />
		<property name="maxUploadSize" value="10485760" />
		最多上传10M,初始化了此类,MultipartFile 将会收到文件,而request将不会!
	</bean> -->

然后把原有的文件接收方法,改为此代码,

注释详细,就不多废话了:

	/**
	 * 从 request 中获取上传的文件
	 * @warn 后续需要 删除处理文件上传时
	 *  生成的临时文件 ,使用item.delete();
	 * @param request	http请求
	 * @param encoding  解码方式,传null默认 utf-8
	 * @return 返回的是一个 FileItem 集合
	 */
	public List<FileItem> getUploadInputSteam(HttpServletRequest request,String encoding){
		if (encoding==null || "".equals(encoding)) {
			encoding = "UTF-8";
		}
		List<FileItem> items = new ArrayList<FileItem>();
		//初始化需要解析文件的几个类
		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding(encoding);
		if (!ServletFileUpload.isMultipartContent(request)) {
			return items;
		}
		try {
			//使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合
			//每一个FileItem对应一个Form表单的输入项
			List<FileItem> list = upload.parseRequest(request);
			for (FileItem item : list) {
				 //如果fileitem中封装的是普通输入项的数据
				if (item.isFormField()) {
//						String name = item.getFieldName();
//						 //解决普通输入项的数据的中文乱码问题
//						String value = item.getString(encoding);
//						System.out.println(name +"="+value);
				}else{
					String fileName = item.getName();
					if (fileName==null||fileName.trim().equals("")) {
						continue;
					}
					//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,
					//如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
			        //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
//					fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
					items.add(item);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			return items;
		}
		return items;
	}
	@RequestMapping("/testUpload")
	@ResponseBody
	public String testUpload(HttpServletRequest request) throws Exception{
		//获取文件集合
		List<FileItem> items = getUploadInputSteam(request, "utf-8");
		//取第一个做实验
		FileItem item = items.get(0);
		
		//上传的文件名
		String fileName = item.getName();
		fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
		
		//数据流获取,获得数据流你可以自由解析 , 保存 等操作
		InputStream in = item.getInputStream();
		
		//关闭流
		in.close();
		
		//最后一定要删除,item的临时文件
		item.delete();
		return "success!";
	}

注意:

1.解析文件的类 都来自 org.apache.commons 的这个包

2.前端传来一定要写 好表单的,action 的 url ,enctype="multipart/form-data",post请求

3.input 按钮指明 type="file" name="xxx" 然后还有 提交按钮  (使用ajax异步提交也行) 

 例如:

<form action="test/testUpload" method="post"
		enctype="multipart/form-data">
		
		<input type="file" name="myFile" value="选择文件"> 
		<input type="submit" value="提交文件" />
	</form>

猜你喜欢

转载自blog.csdn.net/weixin_42144379/article/details/85333023