java上传图片

原文:

https://blog.csdn.net/f7ashion/article/details/137058218

我们在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();
}
}
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/f7ashion/article/details/137058218

posted @ 2024-08-19 13:54  刘贵庆  阅读(4)  评论(0编辑  收藏  举报