需求:上传图片,更新图片,删除图片在一个接口中实现,存进java中static中
1.图片上传有三种上传位置
1).存储到图片服务器(暂时没关注)
2).图片存储到电脑的某一个盘,用nginx 代理展示(这里做到了 上传,nginx 代理展示图片,后被领导要求放进静态资源文件下。)
3).就是直接存储到静态资源文件下(项目的static上)
2.数据库中存在的形式;数据库加name这个字段就是为了后面删除这个图片。
3.java后台
需要一个工具类,直接粘贴,放进util工具包中
public class FileUtil {
//静态方法:三个参数:文件的二进制,文件路径,文件名
//通过该方法将在指定目录下添加指定文件
public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception {
File targetFile = new File(filePath);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
//二进制写入
FileOutputStream out = new FileOutputStream(filePath + fileName);
out.write(file);
out.flush();
out.close();
}
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
return true;
} else {
return false;
}
} else {
return false;
}
}
public static String renameToUUID(String fileName) {
return UUID.randomUUID() + "." + fileName.substring(fileName.lastIndexOf(".") + 1);
}
}
这一块几乎没有改变,没有用uuid 用的是以时间为名称。
1.controller层
@ResponseBody
@PostMapping("/images")
public Result UploadPhoto(@RequestParam("id") String id,@RequestParam("desc") String desc,@RequestParam("file") MultipartFile file,HttpServletRequest request){
return ResultUtil.success(uploadImage.UploadPhoto(id,desc,file,request));
}
基本上没有说明逻辑,因为我这个里面有其他参数,所有实现全部给到业务层去了。然后resutlUtill 是统用返回结果集,你改为你的result就行
2.serviceImpl层
public class UploadImageImpl implements UploadImage{
@Autowired
BizTbcImageTextMapper bizTbcImageTextMapper;
/**
* 1.存放在这个路径下:该路径是该工程目录下的static文件下:(注:该文件可能需要自己创建)
* 放在static下的原因是,存放的是静态文件资源,即通过浏览器输入本地服务器地址,加文件名时是可以访问到的
* 2.如果需要将static静态资源路径改掉的话,可以将path替换一下,在用nginx作为代理展示图片,
* 例如String path = "D:\\images\\";此路径最好是陪在yml中
*/
@Override
public String UploadPhoto(String id1, String desc, MultipartFile file, HttpServletRequest request) {
//图片合法性,这些都是判断,可以不用看
String fileNames = file.getOriginalFilename();
int split = fileNames.lastIndexOf(".");
String suffix = fileNames.substring(split+1,fileNames.length());
//判断文件类型,因为我这边是图片,所以只设置三种合法格式
if(suffix.equals("jpg") || suffix.equals("png") || suffix.equals("gif")) {
}else {
//直接走,不合法抛出异常,我这个可以直接返回给也页面,你们这一块可以自己处理,或者直接返回null去contrller层
throw new BDException("图片格式只可是jpg、png、gif", 21001);
}
// 判断是否存在id1 ,不存在则存储
String fileName = file.getOriginalFilename();
//这里获取的是项目的根路径,直接加上了static/imgupload/下就找到图片,eclipse找不到,就直接去电脑文件夹找
String path = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static/imgupload/";
String ip = request.getLocalAddr();
int port = request.getLocalPort();
List<BizTbcImageTextDO> list = bizTbcImageTextMapper.get(id1);
// 获取文件名称,包含后缀
try {
Date date = new Date();
fileName = date.getTime()+""+date.getSeconds()+"."+fileName.substring(fileName.lastIndexOf(".") + 1);;
FileUtil.uploadFile(file.getBytes(), path, fileName);
BizTbcImageTextDO bizTbcImageText = new BizTbcImageTextDO();
// bizTbcImageText.setUpdateid(ShiroUtils.getUserId());
bizTbcImageText.setUpdatetime(date);
bizTbcImageText.setTextdesc(desc);
bizTbcImageText.setName(fileName);
//这里给的是手动给url和端口,+访问地址,起始就是静态资源访问地址,手动拼的。
bizTbcImageText.setUrl(ip+":"+port+"/imgupload/"+fileName);
bizTbcImageText.setId1(id1);
if(null == list || list.size() <= 0) {
// bizTbcImageText.setCreateid(ShiroUtils.getUserId());
bizTbcImageText.setCreatetime(date);
int a = bizTbcImageTextMapper.save(bizTbcImageText);
System.out.println("------------------》新增"+a);
}else {
//存在则更新,删除以前的图片
if(file != null) {
for (int i = 0; i < list.size();) {
BizTbcImageTextDO biz = list.get(0);
if(biz != null) {
String FN= path + biz.getName();
FileUtil.deleteFile(FN);
}
break;
}
}
int a = bizTbcImageTextMapper.update(bizTbcImageText);
System.out.println("------------------》更新"+a);
}
} catch (Exception e) {
e.printStackTrace();
}
return ip+":"+port+"/imgupload/"+fileName;
}
然后就可以测试了,那里不懂,可以直接问哦。由于参考的页面太多,都不记得了参考地址了,不过非常感谢你们。
总结: 刚开始都报错,还有思路不清,但是需要你仔细耐心看,起始真的不算很难,只需要将工具类好好利用,当然不尝试,肯定做不出来,在慢慢的做之中会理解越来越深。