Springboot添加图⽚Springboot 上传图⽚
框架:ssm mybatis-plus
业务要求:
实现图⽚上传的操作
url:/pic/upload
参数信息:uploadFile
返回值:ImageVO对象
1. 校验⽂件有效性(service实现类)
传统图⽚格式⼤部分为.jpg .png .gif 以这三个格式为案例
1.1 定义图⽚后缀名的集合
private static Set<String> imageTypeSet =new HashSet<>();
static{
imageTypeSet.add(".jpg");
imageTypeSet.add(".png");
imageTypeSet.add(".gif");
}
1.2 获取图⽚的名称
String fileName = OriginalFilename();//获取原始⽂件名
1.3 获取图⽚的类型
可以⽤正则表达式和集合进⾏校验
int index = fileName.lastIndexOf(".");
String fileType = fileName.substring(index);//.jpg
if(!ains(fileType)){//如果类型不匹配
return ImageVo.fail();
}
fileName.lastIndexOf(".") 由后向前获取数据
fileName.IndexOf(".")由前向后获取数据
2. 判断⽂件是否为恶意程序
如何判断⽂件是否为恶意程序? 需要判断⽂件是否含有图⽚的特性
2.1 将上传的⽂件的类型利⽤图⽚api进⾏转化
如果转化不成功则⼀定不是图⽚
BufferedImage bufferedImage = InputStream());
2.2 校验是否有图⽚的特有属性
图⽚特有属性是⾼度/宽度等
int width = Width();
int heigth = Height();
2.3校验宽度和⾼度是否有值
某些⽂件可能设置了⾼度和宽度,需要进⾏进⼀步的校验
if(width==0||heigth==0){
return ImageVo.fail();
}
上述代码有异常需要处理
整体代码为
try{
BufferedImage bufferedImage = InputStream());
int width = Width();
int heigth = Height();
if(width==0||heigth==0){
return ImageVo.fail();
}
}catch(IOException e){
e.printStackTrace();
return ImageVo.fail();//返回失败即可
}
ImageVo类
@Data
@Accessors(chain =true)
@NoArgsConstructor
@AllArgsConstructor
public class ImageVo implements Serializable {
private static final long serialVersionUID =-7982524210249421268L;
private Integer error;//是否有错误
private String url;//图⽚访问的虚拟的地址
private Integer width;//宽度
private Integer hight;//⾼度
public static ImageVo fail(){
return new ImageVo(1,null,null,null);
}
public static ImageVo success(String url){
return new ImageVo(0,url,null,null);
}
public static ImageVo success(String url,Integer width,Integer hight){
return new ImageVo(0,url,width,hight);
}
}
3. 实现分⽬录存储
不可能将所有的上传的图⽚放到⼀个⽂件夹⾥,需要进⾏分⽬录存储.
⽅案⼀:利⽤hash之后每隔2-3位截取之后拼接
⽅案⼆:以时间为单位进⾏分割 yyyy/MM/dd
这⾥⽤的第⼆种⽅法
3.1 利⽤⼯具api将时间转化为指定的格式
String datePath =new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
3.2 动态⽣成⽂件⽬录 根⽬录+时间⽬录
根⽬录
private String localDirPath ="G:/Javaworkspace/images";
⽂件⽬录
String LocalDir = localDirPath + datePath;
3.3 判断⽬录是否存在,如果不存在就创建⽬录
File dirFile =new File(LocalDir);
if(!ists()){
dirFile.mkdirs();//如果不存在则创建⽬录
}
4 防⽌⽂件重名
4.1 ⽣成UUID
String uuid = UUID.randomUUID().toString().replace("-","");
4.2 动态⽣成⽂件名
String uuidFileName = uuid + fileType;
```java
### 5. 实现⽂件上传准备⽂件路径
⽂件路径:⽬录+⽂件名
```java
String realFilePath = LocalDir + uuidFileName;
5.1 封装⽂件真实对象
File imageFile =new File(realFilePath);
5.2 实现⽂件上传
try{
}catch(IOException e){
e.printStackTrace();
}
6 ⾃定义虚拟路径
6.1 创建image.properties
#配置图⽚服务器
image.localDirPath=G:/Javaworkspace/images
image.urlPath=image.jt
image.imageTypes=.jpg,.png,.git
6.2 为属性动态赋值
//为属性动态赋值`
@Value("${image.localDirPath}")
private String localDirPath;// = "G:/Javaworkspace/images"; @Value("${image.urlPath}")
private String urlPath;//= "image.jt";
6.3 实现路径拼接
String url = urlPath + datePath + uuidFileName;
整体代码 service实现类
@Service
@PropertySource("classpath:/properties/image.properties") //@PropertySource("classpath:/properties/image.properties") public class FileServiceImpl implements FileService{
/*
* 1. 校验⽂件有效性 .jpg .png .gif
* 2. 校验⽂件是否为恶意程序 (⽊马.exe).jpg
* 3. 提⾼⽤户检索图⽚的效率分⽬录存储
* 4. 为了防⽌重名图⽚的提交⾃定义⽂件的名称\
* 5. 实现图⽚的物理上传本地磁盘中
* 6. 准备⼀个访问图⽚的虚拟的路径
*/
//定义图⽚后缀名集合
private static Set<String> imageTypeSet =new HashSet<>();
//为属性动态赋值`
@Value("${image.localDirPath}")
private String localDirPath;// = "G:/Javaworkspace/images";
@Value("${image.urlPath}")
private String urlPath;//= "image.jt"; //定义了虚拟路径的域名
static{
imageTypeSet.add(".jpg");
imageTypeSet.add(".png");
imageTypeSet.add(".gif");
}
@Override
public ImageVo upload(MultipartFile uploadFile){
//校验图⽚的类型 1.利⽤正则表达式 2.利⽤⼏集进⾏校验
//1.1 获取图⽚的名称 abc.jpg
String fileName = OriginalFilename();//获取原始⽂件名
fileName = LowerCase();//将所有的字母都⼩写
//1.2 获取图⽚的类型
int index = fileName.lastIndexOf(".");
String fileType = fileName.substring(index);//.jpg
if(!ains(fileType)){//如果类型不匹配
return ImageVo.fail();
}
//2.如何判断⽂件是否为恶意程序⽂件是否有图⽚的特有属性
//2.1将上传的⽂件的类型利⽤图⽚API进⾏转化, 如果转化不成功则⼀定不是图⽚try{
BufferedImage bufferedImage = InputStream());
//2.2校验是否有图⽚的特有属性⾼度/宽度
int width = Width();
int heigth = Height();
/
/2.3校验宽度和⾼度是否有值
if(width==0||heigth==0){
return ImageVo.fail();
}
}catch(IOException e){
e.printStackTrace();
return ImageVo.fail();//返回失败即可
}
//3.实现分⽬录存储
springboot架构图// ⽅案⼀:利⽤hash之后每隔2-3位截取之后拼接
// ⽅案⼆:以时间为单位进⾏分割 yyyy/MM/dd
/
/3.1利⽤⼯具api将时间转化为指定的格式
String datePath =new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
//3.2 动态⽣成⽂件⽬录 2部分=根⽬录+时间⽬录
String LocalDir = localDirPath + datePath;
//3.3 判断⽬录是否纯在,如果不纯在就创建
File dirFile =new File(LocalDir);
if(!ists()){
dirFile.mkdirs();//如果不存在则创建⽬录
}
//4 防⽌⽂件重名,需要⾃定义⽂件名称 UUID
//4.1⽣成UUID
String uuid = UUID.randomUUID().toString().replace("-","");
//4.2动态⽣成⽂件名
String uuidFileName = uuid + fileType;
//5 实现⽂件上传准备⽂件路径⽬录+⽂件名称
String realFilePath = LocalDir + uuidFileName;
//5.1 封装⽂件真实对象
File imageFile =new File(realFilePath);
//5.2实现⽂件上传
try{
}catch(IOException e){
e.printStackTrace();
}
//6. 实现路径拼接
//检查⽂件上传业务是否正确
//图⽚存储的根⽬录 G:\Javaworkspace\images\2020\08\05\90065a76326b4a72994583621c5c84fb.jpg
String url = urlPath + datePath + uuidFileName;
//String url = "timgsa.baidu/timg?image&quality=80&size=b9999_10000&sec=1596623702331&di=b1138fe0361d8b9b7111331ba5b33742 &imgtype=0&src=http%3A%2F%2Fa1.att.hudong%2F05%2F00%2F01300000194285122188000535877.jpg";
return ImageVo.success(url);
}
}
Controller层
@Autowired
FileService fileService;
@RequestMapping("/file")
public String file(MultipartFile fileImage){
//实现⽂件上传\
String fileDirPath ="G:/Javaworkspace/images";
File dirFile =new File(fileDirPath);
ists()){
//如果⽂件⽬录没有,则应该新建⽬录
dirFile.mkdir();
}
//3.准备⽂件上传的全路径路径+⽂件名称'
String fileName = OriginalFilename();//⽂件名称.后缀
File realFile =new File(fileDirPath+"/"+fileName);
//将字节信息输出到⽂件中
try{
return"⽂件上传成功";
}catch(IOException e){
e.printStackTrace();
return"⽂件上传失败";
}
}
/*
*实现图⽚上传的操作
* url:/pic/upload
* 参数信息:uploadFile
* 返回值:ImageVO对象
*/
@RequestMapping("/pic/upload")
public ImageVo upload(MultipartFile uploadFile){
return fileService.upload(uploadFile);
}
}
service接⼝
public interface FileService {
ImageVo upload(MultipartFile uploadFile);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论