springmvc文件上传(图片)
最近在做javaee实验,前面的架构都已经搭建完成了结尾老师,说另加个功能给每一个实例加一个封面图,并且支持修改与上传及显示。
所以学习一下关于springmvc的文件上传的知识。
上传文件是由form表单标签中的,file类型的input标签提供的
<div>
<form action="/fileupload" method="post" enctype="multipart/form-data">
<p><span><label>上传封面:</label></span>
<input type="file" name="file"></p>
<input type="submit" value="上传">
</form>
</div>
这里的enctype类型必须选择multipart/form-data 才可以生效。Multipart/form-data是指提交数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
tips:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data才能完整的传递文件数据。
补充:
表单enctype属性,规定了from表单再发送到服务器时候的编码方式,有如下的三个值
1、application/x-www-form-urlencoded 默 认的编码方式,但是再用文本的传输和MP3等大型文件的时候,使用这种编码就显得效率低下了。
2、multipart/from-data。指定传输数据为二进制类型,比如图片、mp3、文件。
3、text/plain。纯文本的传输。空格转换为“+”加号,但不对特殊字符编码。
而后端用MultipartFile file类型接收前端传递的二进制文件数据。
一般常见的存储图片到服务器上的的有两种方式,第一种是把文件图片本地存储到服务器上,数据库只保存文件名称路径,可以节省数据库资源。第二种是直接把文件二进制流通过base64转换编码后,再存储到数据库中,每次获取则重新解码即可。
这里我们采用第一种
文件流工具类:
public class FilePathUtil {
public static final String Img_Path = "E:\\软件测试\\images\\";
}
后端service层代码,controller层则为处理请求页面,这里不做展示了
public boolean saveimage(Course course, MultipartFile file) throws IOException {
if(file!=null){
System.out.println(file);
//原始文件名
String originalFilename = file.getOriginalFilename();
System.out.println("service:"+originalFilename);
//文件为空表示未设置图片
if(originalFilename.isEmpty()){
//默认图片
course.setUrl("b1f2f46d-6be9-4d20-97e8-99cc5b1fce6e.png");
System.out.println("service:默认图片");
return courseMapper.addcourse_image(course)>0;
}
//获取图片后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf('.'));
//生成图片存储的名称,uuid避免相同图片名字冲突,并加上图片后缀
String fileName = UUID.randomUUID().toString() + suffix;
//图片存储路径
String filePath = FilePathUtil.Img_Path + fileName;
File saveFile = new File(filePath);
//将上传的文件保存到服务器文件系统
file.transferTo(saveFile);
//记录下文件名称
course.setUrl(fileName);
}
//持久化course对象
return courseMapper.addcourse_image(course)>0;
}
通过uuid处理过的图片展示如下。