封装VO对象
对于上传的图片文件进行回显
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class ImageVO implements Serializable {
private Integer error;
private String url;//图片虚拟访问路径
private Integer width; //宽度
private Integer height; //高度
//success fail
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);
}
}
参数分析
由客户端JS以及开发者工具中Network,可以得到传递的参数/url/以及需要的返回值即VO
业务:实现商品的文件上传操作
url地址: http://localhost:8091/pic/upload?dir=image
参数: uploadFile 注意字母的大小写
返回值结果: ImageVO对象.
实现
controller
@RestController
public class FileController {
/**
* MultipartFile 接口作用 主要就是优化了文件上传 API集合
* 1. 文件上传位置??? D:\JT-SOFT\images
* 2. 判断一下文件目录是否存在
* 3. 利用API实现文件上传.
*/
/**
* 业务:实现商品的文件上传操作
* url: /pic/upload?dir=image
* 参数: uploadFile 注意字母大小写
* 返回值结果:ImageVO
*/
@Autowired
private FileService fileService;
@RequestMapping("/pic/upload")
public ImageVO upload(MultipartFile uploadFile){
//将所有业务操作,放到service层中完成
return fileService.upload(uploadFile);
}
}
service
@Service
@PropertySource("classpath:/properties/image.properties")
public class FileServiecImpl implements FileService{
@Value("${image.dirPath}")
private String dirPath;
@Value("${image.urlPath}")
private String urlPath;
//为了防止Set集合每次都要创建,则通过static代码块的形式负责封装数据
private static Set<String> imageSet = new HashSet<>();
static {
imageSet.add(".jpg");
imageSet.add(".png");
imageSet.add(".gif");
//....
}
/**
* 文件上传具体步骤:
* 1.如何校验用户上传的是图片? jpg|png
* 2.如何访问用户上传恶意程序 木马.exe.jpg 宽度*高度
* 3.应该采用分目录存储的方式 保存数据
* 4.上传的文件名称应该尽量避免重名 自定义文件名称... UUID.后缀...
* @param uploadFile
* @return
*/
@Override
public ImageVO upload(MultipartFile uploadFile) {
//1.校验图片类型是否正确 jpg|png|gifxxxx 1.正则表达式判断 2.准备集合之后进行校验Set<去重>
//1.1 获取上传的图片类型
String fileName = uploadFile.getOriginalFilename(); //文件的全名 abc.jpg
fileName = fileName.toLowerCase(); //将所有的字符转化为小写
int index = fileName.lastIndexOf(".");
String fileType = fileName.substring(index); //含头不含尾
//1.2判断是否为图片类型 bug
if(!imageSet.contains(fileType)){
//用户上传的不是图片
return ImageVO.fail();
}
//2.上传的数据是否为恶意程序. 高度和宽度是否为null. 利用图片API
try {
BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
if(width==0||height==0){
return ImageVO.fail();
}
//3.采用分目录存储的方式
//String dirPath="C:/soft/images";
//3.1 分目录存储方式1 hash方式 AABBCCDD
//3.1 分目录存储方式2 时间存储方式 2020/09/02
String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
//3.2 准备文件存储的目录
String imageDir=dirPath+dateDir;
File imageFileDir=new File(imageDir);
if (!imageFileDir.exists()){
imageFileDir.mkdirs();
}
//4. 实现文件上传
//4.1 动态拼接文件名称 uuid.后缀
String uuid=UUID.randomUUID().toString().replace("-", "");
String realFileName = uuid+fileType;
//4.2 准备文件上传的全路径 磁盘路径地址+文件名
File imageFile = new File(imageDir+realFileName);
//4.3 实现文件上传
uploadFile.transferTo(imageFile);
//5.动态生成URL地址
//请求协议:http:// https://(带证书的网址,安全性更高,公钥/私钥进行加密解密)
//向服务器运营商购买域名 com cn org hosts文件
//图片存储的虚拟地址的路径 动态变化的路径
//http://image.jt.com/2020/09/02/uuid.jpg
String url = urlPath+dateDir+realFileName;
return ImageVO.success(url,width,height);
} catch (IOException e) {
e.printStackTrace();
return ImageVO.fail();
}
}
}
最后添加了一个properties配置文件,添加了kv,来动态导入参数dirPath/urlPath.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。