SpringMVC 文件上传

目标:实现一个多文件上传功能。

使用框架:spring,springmvc

1.搭建spring和springmvc框架,这个不在本次讲述内容,跳过。

2.在springmvc的配置文件中添加

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"></property>
        <property name="maxUploadSize" value="10485760000"></property>
        <property name="maxInMemorySize" value="1024"></property>
    </bean>

其中:

CommonsMultipartResolver:用于检查请求中是否还有多媒体文件

defaultEncoding:编码格式

maxUploadSize:一次上传的总文件大小

maxInMemorySize:缓存大小

2.controller内容:

	@ResponseBody
	@RequestMapping(value = "/img", method = RequestMethod.POST)
	public ResponseDataVo uploadImg(HttpServletRequest request, String thum) {
		try {
			List<FileBean> list = FileUploadImage.uploadFile(request);
			if (list.size()>0) {
				return ResponseDataVo.success(list);
			}else{
				return ResponseDataVo.error("图片上传失败!");
			}
		} catch (Exception e) {
			SeparateLogger.error(e.getMessage(), e);
			return ResponseDataVo.error("图片上传失败!");
		}
	}


接受文件上传的接口,ResponseDataVo是我自己的返回对象,不用管。

FileUploadImage中的代码:

	/**
	 * 上传图片
	 * 
	 * @param request
	 * @return
	 * @throws Exception
	 */
	public static List<FileBean> uploadFile(HttpServletRequest request) throws Exception {
		// 创建一个通用的多部分解析器
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());		
		// 判断 request 是否有文件上传,即多部分请求
		if (multipartResolver.isMultipart(request)) {
			// 转换成多部分request
			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
			// 取得request中的所有文件名
			Iterator<String> iter = multiRequest.getFileNames();
			while (iter.hasNext()) {
				try {
					// 记录上传过程起始时的时间,用来计算上传时间
					int pre = (int) System.currentTimeMillis();
					// 取得上传文件
					MultipartFile file = multiRequest.getFile(iter.next());
					/** MultipartFile转File */
					CommonsMultipartFile cf = (CommonsMultipartFile) file;
					DiskFileItem fi = (DiskFileItem) cf.getFileItem();
					File f = fi.getStoreLocation();
					//一下可以编写自己的业务代码,保存的文件
					
				} catch (Exception e) {
					logger.error(e.getMessage(), e);
				}

				// break;
			}
		}
		return list;
	}



其中返回的list中的对象是文件名和地址,是我自己的业务对象,不用管。


3.碰到的问题:

a.小文件上传过程提示找不到tmp文件

原因:maxInMemorySize 设置太大,小文件的缓存到内存中,没有写入磁盘临时文件

b.多个文件上传,名字一样,只上传了一张图片

原因:

Iterator<String> iter = multiRequest.getFileNames();

迭代器是获取filename,filename传入的值相同,迭代器以为是一个文件。解决方式:多个文件上传,每个文件名称设置不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值