在使用spring mvc上传图片时,可以很方便在controller层函数传入MultipartFile参数,获取上传图片的信息,从而可以实现图片的存储和展示。
但是在今天完成项目的修改资料功能上,发现了图片上传的一些问题:
如果上传图片进行信息的更新是没有问题的,因为使用@RequestParam MultipartFile file可以在控制层获得文件信息,并且存储至数据库,但是如果本次资料更新没有上传新的图片而是只修改了姓名、昵称…等别的信息时,就无法传入controller层接收了。应该是MultipartFile 参数的问题,所以要换个方式来接收图片文件信息。
String path="static/images";//逻辑路径:存储在数据库的路径信息,上传成功后可以通过拼接url访问到该图片资源信息
String myGetRealPath = myGetRealPath(path, request);//获得图片上传后在本地路径
boolean isMutipart = ServletFileUpload.isMultipartContent(request);
if(isMutipart){//如果是图片上传
MultipartHttpServletRequest nativeRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
MultipartFile imgFile = nativeRequest.getFile("imgFile");
if(imgFile!=null){//判断是否传入了图片文件,如果上传了图片就进行处理,按照流的方式拷贝到服务器上
}else{//如果没有上传图片信息,图片地址按照原地址存储
}
Spring mvc下图片文件上传时的几个点:
1.spring.xml: 配置文件上传解释器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>5242880</value>
</property> </bean>
2.form表单中要有属性:enctype="multipart/form-data"
3.图片存储到数据库时生成新的地址方法:使用UUID
public String newFileName(MultipartFile imgFile){//参数是文件对象
String originalFilename = imgFile.getOriginalFilename();
//abc.jpg
//截取后缀,拼接新的文件名
//后缀
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
//新文件名要求:上传中-防止文件名重复,发生覆盖
String uu = UUID.randomUUID().toString();
String newName=uu+substring;
return newName;
}