图片上传和静态资源映射
- 编写controller层接口
- 上传到文件夹相关配置
- 1 application.properties配置文件:
- 2 Constant类:
- 文件的资源映射
- 配置WebMvcConfigurer的继承类
- 注意
- 测试
编写controller层接口
@ApiOperation("图片上传功能")
@PostMapping("/admin/upload/file")
public ApiRestResponse upload(HttpServletRequest httpServletRequest,
@RequestParam("file") MultipartFile file) {
String fileName = file.getOriginalFilename();
//获取文件后缀
String suffixName = fileName.substring(fileName.lastIndexOf("."));
//生成文件名称UUID
UUID uuid = UUID.randomUUID();
//得到文件全名字
String newFileName = uuid.toString() + suffixName;
//创建文件
//获取文件夹地址
File fileDirectory = new File(Constant.FILE_UPLOAD_DIR);
//文件地址
File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName);
//文件夹不存在,就先创建文件夹
if (!fileDirectory.exists()) {
//如果文件夹创建失败就抛异常(fileDirectory.mkdir())
if (!fileDirectory.mkdir()) {
throw new ImoocMallException(ImoocMallExceptionEnum.MKDIR_FAILED);
}
}
//到这,文件夹就肯定存在了。。
try {
//文件写入 file-->destFile
//这样就把http传入的文件file写入指定的路径下的destFile文件中,完成了文件上传
file.transferTo(destFile);
} catch (IOException e) {
e.printStackTrace();
}
//完成文件上传后,还需要指定http资源映射
try {
return ApiRestResponse
.success(getHost(new URI(httpServletRequest.getRequestURL() + "")) + "/images/"
+ newFileName);
} catch (URISyntaxException e) {
return ApiRestResponse.error(ImoocMallExceptionEnum.UPLOAD_FAILED);
}
}
//获取当前的ip和端口号
private URI getHost(URI uri) {
URI effectiveURI;
try {
effectiveURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(),
null, null, null);
} catch (URISyntaxException e) {
effectiveURI = null;
}
return effectiveURI;
}
上传到文件夹相关配置
1 application.properties配置文件:
配置上传文件的位置
这是错误的(最后少了/)
改为:
不然最后资源映射找不到。。。。。
2 Constant类:
对于静态属性的注入Spring方法:
(注意静态属性的注入方法)
数据获取的流程:
Constant类通过file.upload.dir获取application.properties配置文件的地址,并注入到spring容器,然后controller层直接取数据:
文件的资源映射
我们需要把上传到服务器指定文件夹的文件(图片)能通过http请求显示出来。
如果不映射就无法访问上传的资源图片,如下
就是把资源的地址(文件的在计算机中的路径)和http请求进行绑定。
(静态资源映射)
配置WebMvcConfigurer的继承类
package com.imooc.mall.config;
import com.imooc.mall.common.Constant;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 描述: 配置地址映射
*/
@Configuration
public class ImoocMallWebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//图片的资源映射
registry.addResourceHandler("/images/**").addResourceLocations(
"file:"+Constant.FILE_UPLOAD_DIR);
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
}
}
前面是的http映射地址,后面是资源的文件地址。
注意
文件上传后,返回的http路径
和配置WebMvcConfigurer的继承类中的http路径
应该要对应一致。。
以便通过返回的http路径可以直接请求到资源路径。。。
测试
先上传图片
关于postman上传图片失败的问题:见我这篇博文
返回的http请求路径: