第一步:在application.properties文件中设置上传图片的存放路径
第二步:创建Constant常量类,存放上传路径
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 存放常量
*/
@Component
public class Constant {
//public static final String IMOOC_MALL_USER="imooc_mall_user";//用户存放在session中的key
//public static final String SALT="sdcrvgtn-2k";//MD5加密的盐值
//@Value("${file.upload.dir}") //由于下面的这个属性是静态的,不能直接使用@Value注解,需要使用set方法设置
//public static String FILE_UPLOAD_DIR;//设置上传图片的存储路径
public static String FILE_UPLOAD_DIR;//设置上传图片的存储路径
@Value("${file.upload.dir}") //需要spring注入这个value,因此需要创建bean,使用@component注解
public void setFileUploadDir(String fileUploadDir) {
FILE_UPLOAD_DIR = fileUploadDir;
}
}
第三步:编写上传代码
@PostMapping("/admin/upload/file")
@ApiOperation("上传图片")
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 fileNewName = uuid.toString() + suffixName;
//上传图片的存放目录
File fileDirectory = new File(Constant.FILE_UPLOAD_DIR);
//上传图片的存放路径
File destFile = new File(Constant.FILE_UPLOAD_DIR + fileNewName);
//判断目录是否存在
if (!fileDirectory.exists()) {
if (!fileDirectory.mkdir()) {//目录创建失败
throw new ImoocMallException(ImoocMallExceptionEnum.MKDIR_FAILED);
}
}
try {
file.transferTo(destFile);
} catch (IOException e) {
e.printStackTrace();
}
try {
//httpServletRequest.getRequestURL():http://localhost:8083
return ApiRestResponse.success(getHost(new URI(httpServletRequest.getRequestURL() + "")) + "/images/"+ fileNewName);
} catch (URISyntaxException e) {
return ApiRestResponse.error(ImoocMallExceptionEnum.UPLOAD_FAILED);
}
}
//获取URI:http://localhost:8083
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;
}
测试:
第四步:通过http://localhost:8083/images/3533dbe7-b108-4019-9845-cc428a9c8095.jpg访问图片
发现不能进行查看
那是因为没有设置静态资源映射路径,静态资源到本地目录的映射,能够实现上传图片进行回显
创建配置文件:
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) {
//addResourceLocations 指的是文件放置的目录,addResoureHandler 指的是对外暴露的访问路径
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/");
}
}
成功访问