| import lombok.extern.slf4j.Slf4j; |
| import org.springframework.http.MediaType; |
| import org.springframework.web.bind.annotation.PostMapping; |
| import org.springframework.web.bind.annotation.RequestMapping; |
| import org.springframework.web.bind.annotation.RequestPart; |
| import org.springframework.web.bind.annotation.RestController; |
| import org.springframework.web.multipart.MultipartFile; |
| import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; |
| import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; |
| import software.amazon.awssdk.regions.Region; |
| import software.amazon.awssdk.services.s3.model.GetObjectRequest; |
| import software.amazon.awssdk.services.s3.model.PutObjectRequest; |
| import software.amazon.awssdk.services.s3.model.S3Exception; |
| import software.amazon.awssdk.services.s3.presigner.S3Presigner; |
| import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; |
| import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest; |
| import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest; |
| import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest; |
| import software.amazon.awssdk.utils.IoUtils; |
| import java.io.*; |
| import java.net.HttpURLConnection; |
| import java.net.URL; |
| import java.time.Duration; |
| |
| @Slf4j |
| @RequestMapping("/loadtest") |
| @RestController |
| public class UpLoadController { |
| |
| @Autowired |
| private AwsS3Config s3Config; |
| |
| @PostMapping("/uploadFile") |
| public String uploadFile(@RequestPart(value = "file") MultipartFile multipartFile) { |
| String fileUrl = ""; |
| try { |
| |
| File file = convertMultiPartToFile(multipartFile); |
| |
| String fileName = multipartFile.getOriginalFilename(); |
| |
| Region region = Region.CN_NORTHWEST_1; |
| String presignUrlDurationMinutes = "5000"; |
| |
| long presignUrlDurationMinutesLong = Long.valueOf(presignUrlDurationMinutes); |
| |
| String contentType = MediaType.IMAGE_PNG_VALUE;; |
| |
| AwsBasicCredentials awsBasicCredentials = AwsBasicCredentials.create(s3Config.getAccessKey(),s3Config.getSecretKey()); |
| |
| S3Presigner s3Presigner = S3Presigner.builder().region(region).credentialsProvider(StaticCredentialsProvider.create(awsBasicCredentials)).build(); |
| |
| URL presignedUrl = generatePresignedUrl(s3Presigner, s3Config.getBucketName(), fileName, region, s3Config.getAccessKey(),s3Config.getSecretKey(), presignUrlDurationMinutesLong); |
| |
| uploadObject(presignedUrl, fileName, contentType); |
| |
| URL url = getPresignedUrl(s3Presigner, s3Config.getBucketName(), fileName); |
| fileUrl = url.toString(); |
| |
| file.delete(); |
| } catch (Exception e) { |
| return "UploadController().uploadFile().Exception : " + e.getMessage(); |
| } |
| return fileUrl; |
| } |
| |
| |
| private File convertMultiPartToFile(MultipartFile file) throws IOException { |
| File convFile = new File(file.getOriginalFilename()); |
| FileOutputStream fos = new FileOutputStream(convFile); |
| fos.write(file.getBytes()); |
| fos.close(); |
| return convFile; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| private static URL generatePresignedUrl(S3Presigner s3Presigner, String bucketName, String objectKey, Region region, String accessKeyId, String secretAccessKey, long presignUrlDurationMinutesLong) { |
| |
| PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(bucketName).key(objectKey).build(); |
| |
| PutObjectPresignRequest putObjectPresignRequest = PutObjectPresignRequest.builder().signatureDuration(Duration.ofMinutes(presignUrlDurationMinutesLong)).putObjectRequest(putObjectRequest).build(); |
| PresignedPutObjectRequest presignedPutObjectRequest = s3Presigner.presignPutObject(putObjectPresignRequest); |
| |
| URL presignedUrl = presignedPutObjectRequest.url(); |
| log.info("Presigned URL: ", presignedUrl); |
| log.info("Method needed: ", presignedPutObjectRequest.httpRequest().method()); |
| s3Presigner.close(); |
| return presignedUrl; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static URL getPresignedUrl(S3Presigner presigner, String bucketName, String keyName) { |
| try { |
| |
| GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(bucketName).key(keyName).build(); |
| GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder().signatureDuration(Duration.ofMinutes(1000)).getObjectRequest(getObjectRequest).build(); |
| |
| PresignedGetObjectRequest presignedGetObjectRequest = presigner.presignGetObject(getObjectPresignRequest); |
| log.info("Presigned URL: ", presignedGetObjectRequest.url()); |
| |
| HttpURLConnection connection = (HttpURLConnection) presignedGetObjectRequest.url().openConnection(); |
| |
| presignedGetObjectRequest.httpRequest().headers().forEach((header, values) -> { |
| values.forEach(value -> { |
| connection.addRequestProperty(header, value); |
| }); |
| }); |
| |
| if (presignedGetObjectRequest.signedPayload().isPresent()) { |
| connection.setDoOutput(true); |
| try (InputStream signedPayload = presignedGetObjectRequest.signedPayload().get().asInputStream(); |
| OutputStream httpOutputStream = connection.getOutputStream()) { |
| IoUtils.copy(signedPayload, httpOutputStream); |
| } |
| } |
| |
| try (InputStream content = connection.getInputStream()) { |
| log.info("Service returned response: "); |
| |
| IoUtils.copy(content, System.out); |
| } |
| presigner.close(); |
| |
| return presignedGetObjectRequest.url(); |
| } catch (S3Exception e) { |
| e.getStackTrace(); |
| } catch (IOException e) { |
| e.getStackTrace(); |
| } |
| return null; |
| } |
| |
| |
| |
| |
| |
| |
| |
| private static void uploadObject(URL presignedUrl, String objectLocalPath, String contentType) { |
| |
| BufferedOutputStream bufferedOutputStream = null; |
| |
| BufferedInputStream bufferedInputStream = null; |
| try { |
| |
| HttpURLConnection httpURLConnection = (HttpURLConnection) presignedUrl.openConnection(); |
| |
| httpURLConnection.setDoOutput(true); |
| |
| httpURLConnection.setRequestProperty("Content-Type", contentType); |
| |
| httpURLConnection.setRequestMethod("PUT"); |
| |
| bufferedOutputStream = new BufferedOutputStream(httpURLConnection.getOutputStream()); |
| |
| bufferedInputStream = new BufferedInputStream(new FileInputStream(new File(objectLocalPath))); |
| byte[] buffer = new byte[1024]; |
| |
| int length = bufferedInputStream.read(buffer); |
| while (length > 0) { |
| |
| bufferedOutputStream.write(buffer); |
| length = bufferedInputStream.read(buffer); |
| } |
| |
| bufferedOutputStream.flush(); |
| bufferedOutputStream.close(); |
| log.info("Response Code: ", httpURLConnection.getResponseCode()); |
| log.info("Response Message: ", httpURLConnection.getResponseMessage()); |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } finally { |
| if (bufferedOutputStream != null) { |
| try { |
| bufferedOutputStream.close(); |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| } |
| if (bufferedInputStream != null) { |
| try { |
| bufferedInputStream.close(); |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| } |
| } |
| } |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App