我们在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下的image
String 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下的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);
}
//在数据库保存照片的访问路径,数据库懒得建,就没写。
// 打印程序的 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\picture
String userDir = System.getProperty("user.dir");
//保存图片的路径,我们存放在resources下static下的image
String value = userDir + "\\src\\main\\resources\\static\\image\\";
//这要写你的云服务器的ip
String 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\picture
String userDir = System.getProperty("user.dir");
//保存图片的路径,我们存放在resources下static下的image
String 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地址和端口号有高级写法,自己搜。但是我这么写也没毛病。
//这要写你的云服务器的ip
String ip = "127.0.0.1";
//你程序的端口号
String port = "8080";
String photoUrl = "http://" + ip + ":" + port + "/image/" + file.getName();
System.out.println(photoUrl);
return file.getAbsolutePath();
}
}