package com.simple.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.GeneratePresignedUrlRequest; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.simple.common.ResultData; import com.simple.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.beans.factory.annotation.Value; 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.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.UUID; @RestController @RequestMapping(value = "upload") @Api(description = "文件上传接口") public class UploadController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Value("${fileUpload.path}") private String filePath; @Value("${fileUpload.server}") private String server; @Autowired private AwsProperty awsProperty; /** * 上传文件 * * @param multiReq * @return * @throws Exception */ @PostMapping(value = "/fileUpload", consumes = "multipart/*", headers = "content-type=multipart/form-data") @ApiOperation("上传文件") public ResultData fileUpload(@RequestParam("file") MultipartFile multiReq) { ResultData data = new ResultData(); FileOutputStream fos = null; BufferedInputStream fs = null; try { File targetFile = new File(filePath); if (!targetFile.exists()) { targetFile.mkdirs(); } String fileName = UUID.randomUUID().toString(); int dot = multiReq.getOriginalFilename().lastIndexOf('.'); fileName = fileName + multiReq.getOriginalFilename().substring(dot, multiReq.getOriginalFilename().length()); fos = new FileOutputStream(new File(filePath + File.separator + fileName)); fs = (BufferedInputStream) multiReq.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = fs.read(buffer)) != -1) { fos.write(buffer, 0, len); } fos.close(); fs.close(); data.code = ResultData.SUCCESS; Map map = new HashMap<>(); map.put("imgarray", server + "/" + fileName); data.data = map; } catch (Exception e) { e.printStackTrace(); data.code = ResultData.ERROR; data.message = "上传失败"; } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } if (fs != null) { try { fs.close(); } catch (IOException e) { e.printStackTrace(); } } } 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) { ResultData data = new ResultData(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(multiReq.getContentType()); metadata.setContentLength(multiReq.getSize()); FileOutputStream fos = null; BufferedInputStream fs = null; try { AmazonS3 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(); String fileName = UUID.randomUUID().toString(); int dot = multiReq.getOriginalFilename().lastIndexOf('.'); fileName = fileName + multiReq.getOriginalFilename().substring(dot, multiReq.getOriginalFilename().length()); s3.putObject( new PutObjectRequest(awsProperty.getBucketName(), fileName, multiReq.getInputStream(), metadata) .withCannedAcl(CannedAccessControlList.PublicRead)); GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(awsProperty.getBucketName(), fileName); URL url = s3.generatePresignedUrl(urlRequest); logger.info(url.toString()); data.code = ResultData.SUCCESS; Map map = new HashMap<>(); map.put("imgarray", url.toString()); data.data = map; return data; } 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()); } 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()); } catch (IOException ioe) { data.code = ResultData.ERROR; logger.warn("Caught an IOException: " + ioe.getMessage()); } return data; } }