MultipartFile实现图片上传上传
MultipartFile: SpringMVC专对文件的上传开发的API/*** url地址:/file* 参数: fileImage* 返回值: 返回成功的提示信息** 知识回顾:IO流的操作的方式作业*1.低级流FileInputStreamFile/FileOutputStream*2.缓存流BufferedInputStream/BufferedOutputStream*
·
MultipartFile: SpringMVC专对文件的上传开发的API
1 文件上传入门案例
/**
* url地址:/file
* 参数: fileImage
* 返回值: 返回成功的提示信息
*
* 知识回顾: IO流的操作的方式 作业
* 1.低级流 FileInputStreamFile/FileOutputStream
* 2.缓存流 BufferedInputStream/BufferedOutputStream
* 3.高级流字符流 Reader/Writer
*
* 最大的困难: 1.API不好记..... 多
* 2.代码的格式 不好理解
* 3.经常性的出现不关流的失误.
*
* MultipartFile: SpringMVC专对文件的上传开发的API
* 默认的最大只允许上传1M的数据
* @return
*/
@RequestMapping("/file")
public String upload(MultipartFile fileImage) throws IOException {
//1.获取图片的真实名称
String fileName = fileImage.getOriginalFilename();
//2.设定文件上传的地址 写成/更加符合Linux的语法特点 为了以后通用使用/
String dir = "E:/JT_IMAGE";
//3.最好对目录进行校验 判断是否存在.
File dirFile = new File(dir);
if(!dirFile.exists()){
//如果文件不存在,则创建一个文件目录
dirFile.mkdirs();
}
//4.实现文件上传 需要指定文件的全路径 目录路径/文件名称
String filePath = dir + "/" + fileName;
//5.实现文件上传操作
fileImage.transferTo(new File(filePath));
return "文件上传成功!!!!";
}
2. 实现图片文件上传
1 页面URL分析
2 参数说明
3 页面JS分析
4 文件上传返回值分析
5 回显VO封装
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class ImageVo {
//{"error":0,"url":"图片的保存路径","width":"图片的宽度","height":图片的高度}
private Integer error; //0 正常 1失败
private String url;
private Integer width;
private Integer height;
public static ImageVo fail(){
return new ImageVo(1,null,null,null);
}
public static ImageVo success(String url,Integer width,Integer height){
return new ImageVo(0, url, width, height);
}
}
6 编辑FileController
/**
* 实现文件上传
* 1.页面URL地址:http://localhost:8091/pic/upload?dir=image
* 2.参数信息: uploadFile
* 3.返回值: ImageVO对象
*/
@RequestMapping("/pic/upload")
public ImageVO uploadFile(MultipartFile uploadFile){
return fileService.upload(uploadFile);
}
7 编辑properties配置文件
8 编辑FileService
import com.jt.vo.ImageVo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
@Service
@PropertySource(value = "classpath:/properties/image.properties" ,encoding = "UTF-8")
public class FileServiceImpl implements FileService{
//方式1:利用集合实现数据的校验
private static Set<String> typeSet=new HashSet<>();
@Value("${image.localDirPath}")
private String localDirPath; //="E:/JT_IMAGE";
@Value("${image.urlPath}")
private String urlPath; //="http://image.jt.com";
static {//静态代码块 为属性赋值,初始化实例对象
typeSet.add(".jpg");
typeSet.add(".png");
typeSet.add(".gif");
}
/**
* 知识点:
* 1、代码的安全性
* 2多问一下自己,如果什么该怎么办
*
* 文件上传的业务说明:
* 1、校验文件上传是否为图片的类型??jpg/png/gif...
* 2、为了防止恶意的程序,需要校验是否为图片的文件 木马.exe.jpg
* 3、为了保证检索的速度,需要将图片,分目录存储
* 4、如何防止我们文件重名
* @param uploadFile
* @return
*/
/*@Override
public ImageVo upload(MultipartFile uploadFile) {
//1、校验是否为图片类型 (BUG 一般条件下不出问题,当传入特定数据时,可能出现问题)
//1.1 获取用户上传文件的类型 a.jpg
String fileName = uploadFile.getOriginalFilename();
//为了防止大小写问题 导致的校验异常bug
fileName = fileName.toLowerCase();
//1.2 获取下标
int index = fileName.lastIndexOf(".");
//1.3 如果下标为-1没有后缀,提前结束
if (index==-1){
//没有后缀,程序应该提前结束
return ImageVo.fail();
}
String fileType = fileName.substring(index);
//1.3校验是否为图片类型
if (!typeSet.contains(fileType)){
//图片类型不符
return ImageVo.fail();
}
return null;
}*/
/**
* 知识点:
* 1、代码的安全性
* 2多问一下自己,如果什么该怎么办
*
* 文件上传的业务说明:
* 1、校验文件上传是否为图片的类型??jpg/png/gif...
* 2、为了防止恶意的程序,需要校验是否为图片的文件 木马.exe.jpg
* 3、为了保证检索的速度,需要将图片,分目录存储
* 4、如何防止我们文件重名
* @param uploadFile
* @return
*/
@Override
public ImageVo upload(MultipartFile uploadFile) {
//1、校验文件类型 abc.jpg
String fileName = uploadFile.getOriginalFilename().toLowerCase();
//1.1 利用正则表达式校验是否满足图片格式要求
if (!fileName.matches("^.+\\.(jpg|png|gif)$")){
return ImageVo.fail();
}
//2、校验是否为图片对象
try{
BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
int width=bufferedImage.getWidth();
int height=bufferedImage.getHeight();
if (width == 0||height==0){
return ImageVo.fail();
}
//3、实现分目录存储
//3.1 动态生成hashcode编码 之后2位一隔 生成多级目录,
// 目录层积太深,笛卡尔较大,遍历不便
//3.2 可以动态的以当前的时间为存储的目录结构
String dateDirPath=
new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
//文件的存储目录 E:/JT_IMAGE/2021/01/26/
String fileDirPath=localDirPath+dateDirPath;
File fileDir=new File(fileDirPath);
if (!fileDir.exists()){ //判断文件目录是否存在
fileDir.mkdirs(); //创建目录
}
//4、利用UUID动态生成图片名称 uuid.jpg
String uuid =
UUID.randomUUID().toString().replace("-", "");
//abc.jpg
String fileType=fileName.substring(fileName.lastIndexOf("."));
String newFileName=uuid+fileType;
//5、实现文件上传
File realFile=new File(fileDirPath+newFileName);
uploadFile.transferTo(realFile);
//6、编辑图片的虚拟路径
//6.1 磁盘地址 E:\JT_IMAGE\2021\01\26\1b0e435933ac42cabec53b20ffbcfe90.png
//6.2 虚拟地址 http://image.jt.com\2021\01\26\1b0e435933ac42cabec53b20ffbcfe90.png
String url=urlPath+dateDirPath+newFileName;
return ImageVo.success(url, width, height);
}catch (IOException e){
e.printStackTrace();
return ImageVo.fail();
}
}
}
9.页面效果展现
1).上传图片完成之后,显示域名地址如下
2).切换磁盘地址 检查路径是否正确
更多推荐
已为社区贡献1条内容
所有评论(0)