我们在resources目录下创建image目录来存放上传的图片
service层懒的写,就都写controller层了。
@RestController
@RequestMapping("/upload")
public class upload {@PostMapping("/pic")public String upLoad(@RequestParam("multipartFile")MultipartFile multipartFile) {//判断图片是否存在if (multipartFile.isEmpty()) {return null;}//图片的新名字,使用uuid为了图片名字的唯一性,防止重名String name = UUID.randomUUID().toString().replace("-","");/** 获取上传图片的后缀* multipartFile.getOriginalFilename()获取图片名字* 例如:图片名字是picture.png,最后type会等于.png* substring和lastIndexOf都是String的方法,不会自己搜*/String type = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf('.'));//保存图片的路径,我们存放在resources下static下的imageString value = "src/main/resources/static/image/";//创建文件File file = new File(value+name+type);try {//transferTo 图片复制multipartFile.transferTo(file);} catch (IOException e) {throw new RuntimeException(e);}return file.getAbsolutePath();}
}
我们使用postman传照片。
结果报错了,明显我们要保存的路径是不对的,为什么,因为 multipartFile 要的是绝对路径,不是相对路径,如果是相对路径的话,他不会在你相对路径前面添加你项目的路径,而是tomcat的路径,因此我们修改一下。
修改后:
@RestController
@RequestMapping("/upload")
public class upload {@PostMapping("/pic")public String upLoad(@RequestParam("multipartFile")MultipartFile multipartFile) {//判断图片是否存在if (multipartFile.isEmpty()) {return null;}//图片的新名字,使用uuid为了图片名字的唯一性,防止重名String name = UUID.randomUUID().toString().replace("-","");/** 获取上传图片的后缀* multipartFile.getOriginalFilename()获取图片名字,例如:picture.png* substring和lastIndexOf都是String的方法,不会自己搜*/String type = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf('.'));//保存图片的路径,我们存放在resources下static下的image//修改后的代码String value = "D:/code/picture/src/main/resources/static/image/";//创建文件File file = new File(value+name+type);try {//transferTo 图片复制multipartFile.transferTo(file);} catch (IOException e) {throw new RuntimeException(e);}return file.getAbsolutePath();}
}
我们再使用postman上传
结果对了:我们的目录出现了上传的图片
一般照片的访问路径是要保存到数据库,然后前端根据路径找到照片的。
@RestController
@RequestMapping("/upload")
public class upload {@PostMapping("/pic")public String upLoad(@RequestParam("multipartFile")MultipartFile multipartFile) {//判断图片是否存在if (multipartFile.isEmpty()) {return null;}//图片的新名字,使用uuid为了图片名字的唯一性,防止重名String name = UUID.randomUUID().toString().replace("-","");/** 获取上传图片的后缀* multipartFile.getOriginalFilename()获取图片名字,例如:picture.png* substring和lastIndexOf都是String的方法,不会自己搜*/String type = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf('.'));//保存图片的路径,我们存放在resources下static下的imageString value = "D:/code/picture/src/main/resources/static/image/";//创建文件File file = new File(value+name+type);try {//transferTo 图片复制multipartFile.transferTo(file);} catch (IOException e) {throw new RuntimeException(e);}//在数据库保存照片的访问路径,数据库懒得建,就没写。// 打印程序的 IP 地址、端口号和照片路径//这里获取ip地址和端口号有高级写法,自己搜。但是我这么写也没毛病。String photoUrl = "http://" + "127.0.0.1" + ":" + "8080" + "/image/" + file.getName();System.out.println(photoUrl);return file.getAbsolutePath();}
}
我们浏览器是能访问到的。
如果你的程序要部署到云服务器上,那绝对路径和照片的url是要更改的
// 使用 System 类的 getProperty() 方法获取用户的当前工作目录// 如果路径是这个D:/code/picture/src/main/resources/static/image/// userDir 会是 D:\code\pictureString userDir = System.getProperty("user.dir");//保存图片的路径,我们存放在resources下static下的imageString value = userDir + "\\src\\main\\resources\\static\\image\\";
//这要写你的云服务器的ipString ip = "127.0.0.1";//你程序的端口号String port = "8080";String photoUrl = "http://" + ip + ":" + port + "/image/" + file.getName();//保存到你的数据库
完整代码:
@RestController
@RequestMapping("/upload")
public class upload {@PostMapping("/pic")public String upLoad(@RequestParam("multipartFile")MultipartFile multipartFile) {//判断图片是否存在if (multipartFile.isEmpty()) {return null;}//图片的新名字,使用uuid为了图片名字的唯一性,防止重名String name = UUID.randomUUID().toString().replace("-","");/** 获取上传图片的后缀* multipartFile.getOriginalFilename()获取图片名字,例如:picture.png* substring和lastIndexOf都是String的方法,不会自己搜*/String type = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf('.'));// 使用 System 类的 getProperty() 方法获取用户的当前工作目录// 如果路径是这个D:/code/picture/src/main/resources/static/image/// userDir 会是 D:\code\pictureString userDir = System.getProperty("user.dir");//保存图片的路径,我们存放在resources下static下的imageString value = userDir + "\\src\\main\\resources\\static\\image\\";//创建文件File file = new File(value+name+type);try {//transferTo 图片复制multipartFile.transferTo(file);} catch (IOException e) {throw new RuntimeException(e);}//在数据库保存照片的访问路径,数据库懒得建,就没写。// 打印程序的 IP 地址、端口号和照片路径//这里获取ip地址和端口号有高级写法,自己搜。但是我这么写也没毛病。//这要写你的云服务器的ipString ip = "127.0.0.1";//你程序的端口号String port = "8080";String photoUrl = "http://" + ip + ":" + port + "/image/" + file.getName();System.out.println(photoUrl);return file.getAbsolutePath();}
}