From 1fa618ec9e6697c3e6e1fd5d1f1d66a62413cd21 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Thu, 18 Apr 2019 06:33:46 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=B0=8F=E7=A8=8B=E5=BA=8F=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6][=E6=96=B0=E5=A2=9E]:C=E7=AB=AF/B=E7=AB=AF?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6,=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8Dspring=20boot=20multipart=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mallinkBApi/pom.xml | 5 + .../main/java/com/iformall/BApplication.java | 3 +- .../com/iformall/config/WebMvcConfig.java | 12 + .../iformall/controller/UploadController.java | 14 +- mallinkCApi/pom.xml | 5 + .../main/java/com/iformall/CApplication.java | 3 +- .../java/com/iformall/config/AwsProperty.java | 52 +++++ .../com/iformall/config/WebMvcConfig.java | 12 + .../iformall/controller/UploadController.java | 211 ++++++++++++++++++ 9 files changed, 308 insertions(+), 9 deletions(-) create mode 100644 mallinkCApi/src/main/java/com/iformall/config/AwsProperty.java create mode 100644 mallinkCApi/src/main/java/com/iformall/controller/UploadController.java diff --git a/mallinkBApi/pom.xml b/mallinkBApi/pom.xml index a6c7c0588..0014f6ca3 100644 --- a/mallinkBApi/pom.xml +++ b/mallinkBApi/pom.xml @@ -22,6 +22,11 @@ mybatis-multi-tenancy 1.0 + + commons-fileupload + commons-fileupload + 1.3.3 + diff --git a/mallinkBApi/src/main/java/com/iformall/BApplication.java b/mallinkBApi/src/main/java/com/iformall/BApplication.java index 8ab96db8a..50460e994 100644 --- a/mallinkBApi/src/main/java/com/iformall/BApplication.java +++ b/mallinkBApi/src/main/java/com/iformall/BApplication.java @@ -5,6 +5,7 @@ import org.rocketmq.starter.annotation.EnableRocketMQ; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration; import org.springframework.context.annotation.Bean; import tk.mybatis.spring.annotation.MapperScan; @@ -12,7 +13,7 @@ import tk.mybatis.spring.annotation.MapperScan; * @author chenkx * @date 2017-12-26 */ -@SpringBootApplication +@SpringBootApplication(exclude = {MultipartAutoConfiguration.class}) @MapperScan(basePackages = {"com.iformall.mapper"}) @EnableEncryptableProperties @EnableRocketMQ diff --git a/mallinkBApi/src/main/java/com/iformall/config/WebMvcConfig.java b/mallinkBApi/src/main/java/com/iformall/config/WebMvcConfig.java index 819f804b8..abe073f80 100644 --- a/mallinkBApi/src/main/java/com/iformall/config/WebMvcConfig.java +++ b/mallinkBApi/src/main/java/com/iformall/config/WebMvcConfig.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.multipart.MultipartResolver; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.config.annotation.*; import java.math.BigDecimal; @@ -111,4 +113,14 @@ public class WebMvcConfig implements WebMvcConfigurer { registrationBean.setName("koalaSignFilter"); return registrationBean; } + + @Bean(name = "multipartResolver") + public MultipartResolver multipartResolver() { + CommonsMultipartResolver resolver = new CommonsMultipartResolver(); + resolver.setDefaultEncoding("UTF-8"); + resolver.setResolveLazily(true); // resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常   + // resolver.setMaxInMemorySize(40960);   + resolver.setMaxUploadSize(2*1024*1024);// 上传文件大小 5M 5*1024*1024   + return resolver; + } } \ No newline at end of file diff --git a/mallinkBApi/src/main/java/com/iformall/controller/UploadController.java b/mallinkBApi/src/main/java/com/iformall/controller/UploadController.java index bc58b1d06..075586365 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/UploadController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/UploadController.java @@ -31,7 +31,7 @@ import java.net.URL; import java.util.*; @RestController -@RequestMapping(value = "upload") +@RequestMapping(value = "/api/upload") @Api(description = "文件上传接口") public class UploadController extends BaseController { @@ -45,7 +45,7 @@ public class UploadController extends BaseController { private ResultData awsUpload(MultipartFile multiReq, ObjectMetadata metadata, String fileName) { ResultData data = new ResultData(); try { - if(s3 == null) { + if (s3 == null) { s3 = AmazonS3ClientBuilder.standard() .withRegion(awsProperty.getClientRegion()) .withCredentials(new AWSCredentialsProvider() { @@ -143,10 +143,10 @@ public class UploadController extends BaseController { public ResultData awsFilesUpload(@RequestParam("files") MultipartFile[] files) { logger.info("[" + getIpAddr() + "] UploadController::awsFilesUpload"); - if(files.length > 0){ + if (files.length > 0) { ResultData data = new ResultData(); - List> dataList = new ArrayList>(); - for(MultipartFile multipartFile: files) { + List> dataList = new ArrayList>(); + for (MultipartFile multipartFile : files) { Map map = new HashMap<>(); ObjectMetadata metadata = new ObjectMetadata(); @@ -167,8 +167,8 @@ public class UploadController extends BaseController { } ResultData data1 = awsUpload(multipartFile, metadata, fileName); - if(data1.code == ResultData.SUCCESS) { - Map _data = (Map)data1.data; + if (data1.code == ResultData.SUCCESS) { + Map _data = (Map) data1.data; map.put("url", (String) _data.get("url")); dataList.add(map); } else { diff --git a/mallinkCApi/pom.xml b/mallinkCApi/pom.xml index 647618dbc..1dbbe6df0 100644 --- a/mallinkCApi/pom.xml +++ b/mallinkCApi/pom.xml @@ -22,6 +22,11 @@ mybatis-multi-tenancy 1.0 + + commons-fileupload + commons-fileupload + 1.3.3 + diff --git a/mallinkCApi/src/main/java/com/iformall/CApplication.java b/mallinkCApi/src/main/java/com/iformall/CApplication.java index c3d60da7e..472ccc689 100644 --- a/mallinkCApi/src/main/java/com/iformall/CApplication.java +++ b/mallinkCApi/src/main/java/com/iformall/CApplication.java @@ -5,6 +5,7 @@ import org.rocketmq.starter.annotation.EnableRocketMQ; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration; import org.springframework.context.annotation.Bean; import tk.mybatis.spring.annotation.MapperScan; @@ -12,7 +13,7 @@ import tk.mybatis.spring.annotation.MapperScan; * @author chenkx * @date 2017-12-26 */ -@SpringBootApplication +@SpringBootApplication(exclude = {MultipartAutoConfiguration.class}) @MapperScan(basePackages = {"com.iformall.mapper"}) @EnableEncryptableProperties @EnableRocketMQ diff --git a/mallinkCApi/src/main/java/com/iformall/config/AwsProperty.java b/mallinkCApi/src/main/java/com/iformall/config/AwsProperty.java new file mode 100644 index 000000000..0329f1d6d --- /dev/null +++ b/mallinkCApi/src/main/java/com/iformall/config/AwsProperty.java @@ -0,0 +1,52 @@ +package com.iformall.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author Stormeye + */ +@Component +@ConfigurationProperties(prefix = "aws") +public class AwsProperty { + // AWS ACCESS KEY + private String access; + + private String secret; + + private String clientRegion; + + private String bucketName; + + public String getAccess() { + return access; + } + + public void setAccess(String access) { + this.access = access; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + public String getClientRegion() { + return clientRegion; + } + + public void setClientRegion(String clientRegion) { + this.clientRegion = clientRegion; + } + + public String getBucketName() { + return bucketName; + } + + public void setBucketName(String bucketName) { + this.bucketName = bucketName; + } +} diff --git a/mallinkCApi/src/main/java/com/iformall/config/WebMvcConfig.java b/mallinkCApi/src/main/java/com/iformall/config/WebMvcConfig.java index c4064057a..d7fd8fa54 100644 --- a/mallinkCApi/src/main/java/com/iformall/config/WebMvcConfig.java +++ b/mallinkCApi/src/main/java/com/iformall/config/WebMvcConfig.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.multipart.MultipartResolver; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.config.annotation.*; import java.math.BigDecimal; @@ -111,4 +113,14 @@ public class WebMvcConfig implements WebMvcConfigurer { registrationBean.setName("koalaSignFilter"); return registrationBean; } + + @Bean(name = "multipartResolver") + public MultipartResolver multipartResolver() { + CommonsMultipartResolver resolver = new CommonsMultipartResolver(); + resolver.setDefaultEncoding("UTF-8"); + resolver.setResolveLazily(true); // resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常   + // resolver.setMaxInMemorySize(40960);   + resolver.setMaxUploadSize(2*1024*1024);// 上传文件大小 5M 5*1024*1024   + return resolver; + } } \ No newline at end of file diff --git a/mallinkCApi/src/main/java/com/iformall/controller/UploadController.java b/mallinkCApi/src/main/java/com/iformall/controller/UploadController.java new file mode 100644 index 000000000..075586365 --- /dev/null +++ b/mallinkCApi/src/main/java/com/iformall/controller/UploadController.java @@ -0,0 +1,211 @@ +package com.iformall.controller; + + +import com.amazonaws.AmazonClientException; +import com.amazonaws.AmazonServiceException; +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.PutObjectRequest; +import com.iformall.common.ResultData; +import com.iformall.config.AwsProperty; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.BufferedInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.util.*; + +@RestController +@RequestMapping(value = "/api/upload") +@Api(description = "文件上传接口") +public class UploadController extends BaseController { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private AwsProperty awsProperty; + + private AmazonS3 s3 = null; + + private ResultData awsUpload(MultipartFile multiReq, ObjectMetadata metadata, String fileName) { + ResultData data = new ResultData(); + try { + if (s3 == null) { + s3 = AmazonS3ClientBuilder.standard() + .withRegion(awsProperty.getClientRegion()) + .withCredentials(new AWSCredentialsProvider() { + @Override + public AWSCredentials getCredentials() { + return new BasicAWSCredentials(awsProperty.getAccess(), awsProperty.getSecret()); + } + + @Override + public void refresh() { + + } + }) + .build(); + } + + s3.putObject( + new PutObjectRequest(awsProperty.getBucketName(), fileName, multiReq.getInputStream(), metadata) + .withCannedAcl(CannedAccessControlList.PublicRead)); + URL url = s3.getUrl(awsProperty.getBucketName(), fileName); + logger.info(url.toString()); + + data.code = ResultData.SUCCESS; + Map map = new HashMap<>(); + map.put("url", url.toString()); + data.data = map; + } catch (AmazonServiceException ase) { + data.code = ResultData.ERROR; + logger.warn("Caught an AmazonServiceException, which " + + "means your request made it " + + "to Amazon S3, but was rejected with an error response" + + " for some reason."); + logger.warn(ase.getMessage()); + data.code = ResultData.ERROR; + data.message = "上传失败"; + } catch (AmazonClientException ace) { + data.code = ResultData.ERROR; + logger.warn("Caught an AmazonClientException, which " + + "means the client encountered " + + "an internal error while trying to " + + "communicate with S3, " + + "such as not being able to access the network."); + logger.warn("Error Message: " + ace.getMessage()); + data.code = ResultData.ERROR; + data.message = "上传失败"; + } catch (IOException ioe) { + data.code = ResultData.ERROR; + logger.warn("Caught an IOException: " + ioe.getMessage()); + data.code = ResultData.ERROR; + data.message = "上传失败"; + } + return data; + } + + /** + * 上传文件 + * + * @param multiReq + * @return + * @throws Exception + */ + @PostMapping(value = "/awsFileUpload", consumes = "multipart/*", headers = "content-type=multipart/form-data") + @ApiOperation("上传文件") + public ResultData awsfileUpload(@RequestParam("file") MultipartFile multiReq) { + logger.info("[" + getIpAddr() + "] UploadController::awsfileUpload"); + + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentType(multiReq.getContentType()); + metadata.setContentLength(multiReq.getSize()); + + FileOutputStream fos = null; + BufferedInputStream fs = null; + + String fileName = UUID.randomUUID().toString(); + int dot = multiReq.getOriginalFilename().lastIndexOf('.'); + if (dot >= 0) { + fileName = getTenantId() + "/" + fileName + multiReq.getOriginalFilename().substring(dot, multiReq.getOriginalFilename().length()); + } else { + fileName = getTenantId() + "/" + fileName; + } + + ResultData data = awsUpload(multiReq, metadata, fileName); + return data; + } + + /** + * 多文件上传 + * + * @param files + * @return + * @throws Exception + */ + @PostMapping(value = "/awsFilesUpload", consumes = "multipart/*", headers = "content-type=multipart/form-data") + @ApiOperation("多文件上传") + public ResultData awsFilesUpload(@RequestParam("files") MultipartFile[] files) { + logger.info("[" + getIpAddr() + "] UploadController::awsFilesUpload"); + + if (files.length > 0) { + ResultData data = new ResultData(); + List> dataList = new ArrayList>(); + for (MultipartFile multipartFile : files) { + Map map = new HashMap<>(); + + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentType(multipartFile.getContentType()); + metadata.setContentLength(multipartFile.getSize()); + + FileOutputStream fos = null; + BufferedInputStream fs = null; + + map.put("key", multipartFile.getOriginalFilename()); + + String fileName = UUID.randomUUID().toString(); + int dot = multipartFile.getOriginalFilename().lastIndexOf('.'); + if (dot >= 0) { + fileName = getTenantId() + "/" + fileName + multipartFile.getOriginalFilename().substring(dot, multipartFile.getOriginalFilename().length()); + } else { + fileName = getTenantId() + "/" + fileName; + } + + ResultData data1 = awsUpload(multipartFile, metadata, fileName); + if (data1.code == ResultData.SUCCESS) { + Map _data = (Map) data1.data; + map.put("url", (String) _data.get("url")); + dataList.add(map); + } else { + // 部分成功 + data.code = ResultData.SUCCESS; + data.data = dataList; + return data; + } + } + data.code = ResultData.SUCCESS; + data.data = dataList; + return data; + + } + return new ResultData(); + } + + /** + * C端上传图片文件 + * + * @param multiReq + * @return + * @throws Exception + */ + @PostMapping(value = "/cimgUpload", consumes = "multipart/*", headers = "content-type=multipart/form-data") + @ApiOperation("C端上传图片文件") + public ResultData cimgUpload(@RequestParam("file") MultipartFile multiReq) { + logger.info("[" + getIpAddr() + "] UploadController::cimgUpload"); + + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentType(multiReq.getContentType()); + metadata.setContentLength(multiReq.getSize()); + + String fileName = multiReq.getOriginalFilename(); + fileName = "cimg/" + fileName; + ResultData data = awsUpload(multiReq, metadata, fileName); + return data; + } + +}