入门案例
编辑页面
<body>
<h1>实现文件长传</h1>
<!--enctype="开启多媒体标签" -->
<form action="http://localhost:8091/file" method="post"
enctype="multipart/form-data">
<input name="fileImage" type="file" />
<input type="submit" value="提交"/>
</form>
</body>
编辑FileController
@RestController
public class FileController {
/**
* 文件上传入门案例
* 1.url:/file
* 2.请求参数: fileImage
* 返回值: 返回字符串
*
* 文件上传具体步骤
* 1.获取文件名称
* 2.指定文件路径
* 3.实现文件上传
* @throws IOException
* @throws IllegalStateException
*/
@RequestMapping("/file")
public String file(MultipartFile fileImage) throws IllegalStateException, IOException {
//1.动态获取文件名称
String fileName = fileImage.getOriginalFilename();
//2.指定文件路径
String localDir = "E:/JT_IMAGE";
//3.判断文件目录是否存在
File dirFile = new File(localDir);
if(!dirFile.exists()) {
dirFile.mkdirs(); //创建多级目录
}
//4.实现文件上传 E:/JT_IMAGE/a.jpg
String filePath = localDir + "/" + fileName;
fileImage.transferTo(new File(filePath));
return "文件上传成功:"+fileName;
}
}
实现商品文件上传
页面分析
// 编辑器参数
kingEditorParams : {
filePostName : "uploadFile", //定义文件上传名称
uploadJson : '/pic/upload', //定义请求路径
dir : "image" //image表示请求只能提交图片信息
},
编辑ImageVO
@Data
@Accessors(chain=true)
@NoArgsConstructor
@AllArgsConstructor
public class ImageVO {
/* {"error":0,"url":"图片的保存路径","width":图片的宽度,"height":图片的高度}*/
private Integer error; //文件上传时是否有误. error=0文件上传成功 error=1 失败
private String url; //图片回显的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);
}
}
编辑FileController
/**
* 业务需求: 实现文件上传
* 页面URL:/pic/upload
* 参数: uploadFile
* 返回值: ImageVO JSON格式
*/
@RequestMapping("/pic/upload")
public ImageVO picUpload(MultipartFile uploadFile) {
return fileService.upload(uploadFile);
}
编辑Properties文件
#定义图片的服务器磁盘地址
image.localDir=E:/JT_IMAGE/
image.url=http://image.jt.com/
编辑FileService
@Service
@PropertySource("classpath:/properties/image.properties")
public class FileServiceImpl implements FileService {
/**
* 关于图片路径的说明:
* 1.本地磁盘路径
* E:\JT_IMAGE\2020\04\13\3b47781f2ce04b10aa64c997ec3efdc8.jpg
* 2.虚拟路径
* http://image.jt.com\2020\04\13\3b47781f2ce04b10aa64c997ec3efdc8.jpg
*
*/
//为了以后代码解耦,应该将配置文件写入properties文件中
@Value("${image.localDir}")
private String localDir; // = "E:/JT_IMAGE/"; //定义根目录
@Value("${image.url}")
private String url; //定义虚拟路径的根目录
/**
* 文件上传步骤:
* 1.校验上传的问题是否为图片 xx.jpg
* 2.判断上传的文件是否为恶意程序(木马)
* 3.需要分目录保存 控制目录中文件的个数
* 4.防止文件重名. UUID动态生成文件名
*
*/
@Override
public ImageVO upload(MultipartFile uploadFile) {
//1.图片类型的校验 jpg|png|gif..... 盗版windows
String fileName = uploadFile.getOriginalFilename();
fileName = fileName.toLowerCase(); //将字符转化为小写
//正则表达式 任意字母,至少有一个.至少满足jpg,png,gif中的一个
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.分目录存储设计 1.按照图片类型存储 2.按照hash方式存储 3.按照日期存储 yyyy/MM/dd
String datePath = new SimpleDateFormat("yyyy/MM/dd/")
.format(new Date());
//动态生成文件目录 E:/JT_IMAGE/2020/4/13/
String fileDir = localDir + datePath;
File imageFile = new File(fileDir);
if(!imageFile.exists()) {
imageFile.mkdirs();//创建多级目录.
}
//4.动态生成文件名称
String uuid = UUID.randomUUID().toString().replace("-","");
//获取原始文件的后缀 a.jpg
int index = fileName.lastIndexOf(".");
String fileType = fileName.substring(index);
String realFileName = uuid + fileType;
//指定文件真实地址 E:/JT_IMAGE/2020/4/13/abc.jpg
String realFilePath = fileDir + realFileName;
//实现文件上传
uploadFile.transferTo(new File(realFilePath));
//了解图片的虚拟路径
//http://image.jt.com\2020\04\13\ uuid.jpg
String realUrl = url + datePath + realFileName;
return ImageVO.success(realUrl, width, height);
} catch (IOException e) {
e.printStackTrace();
return ImageVO.fail();
}
}
}