springboot项目base64上传图片
springboot项目base64上传图片
今天来分享一下自己的爬坑之路,图片上传分为MultipartFile上传和base64上传。今天只分享base64上传图片
配置路径
在application.properties文件中的配置如下
spring.servlet.multipart.maxFileSize=10Mb//最大上传文件spring.servlet.multipart.maxRequestSize=10Mb//最小上传文件file.uploadFolder=C:/file/ //上传的路径,此处因为本地测试服务器只有一个C盘file.staticAccessPath=/file/ //回显路径
在文件中新建config包,在这个包下面新建WebConfiguration ,加注解@Configuration
package manage.config;import java.io.File;import java.util.concurrent.Executors;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ConcurrentTaskExecutor;import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;import org.springframework.web.servlet.config.annotation.CorsRegistry;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;/ * * @author Administrator * */@Configurationpublic class WebConfiguration extends WebMvcConfigurationSupport{//读取配置文件配置@Value("${file.staticAccessPath}") private String staticAccessPath; @Value("${file.uploadFolder}") private String uploadFolder; // 跨域设置 @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/") .allowedMethods("GET", "POST", "DELETE", "PUT","PATCH") .allowedOrigins("*") .maxAge(3600) .allowCredentials(true) .allowedHeaders("*"); super.addCorsMappings(registry); } //配置图片回显 public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(staticAccessPath+"/").addResourceLocations("file:" + uploadFolder+File.separator);// 解决静态资源无法访问 registry.addResourceHandler("/").addResourceLocations("classpath:/static/");// // 解决swagger无法访问// registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");// // 解决swagger的js文件无法访问// registry.addResourceHandler("/webjars/").addResourceLocations("classpath:/META-INF/resources/webjars/"); registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/").addResourceLocations("classpath:/META-INF/resources/webjars/"); super.addResourceHandlers(registry); } @Override public void configureAsyncSupport(AsyncSupportConfigurer configurer){ configurer.setTaskExecutor(new ConcurrentTaskExecutor(Executors.newFixedThreadPool(3))); configurer.setDefaultTimeout(30000); }}
package manage.controller;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import java.util.UUID;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import io.swagger.annotations.Api;import io.swagger.annotations.ApiImplicitParam;import io.swagger.annotations.ApiImplicitParams;import io.swagger.annotations.ApiOperation;import manage.util.Base64Utils;import manage.util.FileUtils;import manage.util.Result;import sun.misc.BASE64Decoder;@SuppressWarnings({ "unused" })@RestController@Api(value="文件上传controller",tags={"上传图片接口"})public class FileUploadController {//读取配置文件(详见上面)@Value("${file.uploadFolder}") private String UPLOAD_FOLDER; / * * @Title: uploadImage * @Description:base64图片上传 * @param base64Data * @return * @return Result * @author 薛锦涛 * @date 2020年4月27日上午9:12:19 */ @ApiOperation("base64图片上传") @PostMapping("/base64Upload") public Result<Object> uploadImage(String base64Data){String dataPrix = ""; //base64格式前头String data = "";//实体部分数据if(base64Data==null||"".equals(base64Data)){ return Result.error("上传失败,上传图片数据为空");}else { String [] d = base64Data.split("base64,");//将字符串分成数组 if(d != null && d.length == 2){ dataPrix = d[0]; data = d[1]; }else { return Result.error("上传失败,数据不合法"); }}String suffix = "";//图片后缀,用以识别哪种格式数据//data:image/jpeg;base64,base64编码的jpeg图片数据if("data:image/jpg;".equalsIgnoreCase(dataPrix)){ suffix = ".jpg";}else if("data:image/x-icon;".equalsIgnoreCase(dataPrix)){ //data:image/x-icon;base64,base64编码的icon图片数据 suffix = ".ico";} else if("data:image/jpeg;".equalsIgnoreCase(dataPrix)){ //data:image/x-icon;base64,base64编码的icon图片数据 suffix = ".jpeg";}else if("data:image/gif;".equalsIgnoreCase(dataPrix)){ //data:image/gif;base64,base64编码的gif图片数据 suffix = ".gif";}else if("data:image/png;".equalsIgnoreCase(dataPrix)){ //data:image/png;base64,base64编码的png图片数据 suffix = ".png";}else { return Result.error("上传图片格式不合法");}String uuid = UUID.randomUUID().toString().replaceAll("-", "");String tempFileName=uuid+suffix;String imgFilePath = UPLOAD_FOLDER+tempFileName;//新生成的图片BASE64Decoder decoder = new BASE64Decoder();try {String replace = base64Data.replace(" ", "+");//这一句必须加,要不然写入图片会错误。 String[] baseStrs = replace.split(","); byte[] b = new byte[0]; b = decoder.decodeBuffer(baseStrs[1]); for (int i = 0; i < b.length; ++i) { if (b[i] < 0) { b[i] += 256; } } OutputStream out = new FileOutputStream(imgFilePath); out.write(b); out.flush(); out.close(); String imgurl=UPLOAD_FOLDER+tempFileName; //imageService.save(imgurl); return Result.success(imgurl);} catch (IOException e) { e.printStackTrace(); return Result.error("上传图片失败");} } }
在使用 BASE64Decoder decoder = new BASE64Decoder(); 这个的时候,会报错无法导入包。
看这个 解决Eclipse无法使用BASE64Decoder decoder