图文上传和下载,图片存储到静态访问的static中,图片url存储到数据库中

需求:上传图片,更新图片,删除图片在一个接口中实现,存进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;
		}

然后就可以测试了,那里不懂,可以直接问哦。由于参考的页面太多,都不记得了参考地址了,不过非常感谢你们。
总结: 刚开始都报错,还有思路不清,但是需要你仔细耐心看,起始真的不算很难,只需要将工具类好好利用,当然不尝试,肯定做不出来,在慢慢的做之中会理解越来越深。

猜你喜欢

转载自blog.csdn.net/xx66_xx/article/details/89522540