前言
Amazon文件服務器的使用,本章之記錄文件的上傳和下載。
pom依賴
首先添加依賴
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>1.11.336</version> </dependency>
正文
提供個工具類
public class FileUtils { // 【你的 access_key】 static final String AWS_ACCESS_KEY = "*********"; // 【你的 aws_secret_key】 static final String AWS_SECRET_KEY = "*********************"; // 儲存桶的名稱 static final String BUCKET_NAME = "app-file-upload"; // 設置服務器所屬地區 static final Regions REGION = Regions.DEFAULT_REGION; // 儲存路徑 static final String PATH = "uploadExcel"; static final BasicAWSCredentials awsCreds = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY); static final AmazonS3 s3 = AmazonS3ClientBuilder.standard() .withCredentials(new AWSStaticCredentialsProvider(awsCreds)).withRegion(REGION).build(); @Autowired protected HttpServletRequest request; @Autowired protected HttpServletResponse response; /** * 上傳到文件返回一個文件儲存后的路徑 * * @param multipartFile * @return * @throws IOException * @throws SdkClientException * @throws AmazonServiceException * @throws Exception */ public static String uploadFileToS3(MultipartFile multipartFile, String type) throws AmazonServiceException, SdkClientException, IOException { if (multipartFile.isEmpty()) { return "文件為空"; } String dateString = DateUtils.convertToDate(LocalDate.now()); long time = System.currentTimeMillis(); // 拼接下文件路徑,為了不會出現文件覆蓋現象,加上時間戳 String s3FilePath = PATH + "/" + type + "/" + dateString + "/" + time + "/" + multipartFile.getOriginalFilename(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(multipartFile.getContentType()); metadata.setContentLength(multipartFile.getSize()); // 開始上傳文件 s3.putObject(BUCKET_NAME, s3FilePath, multipartFile.getInputStream(), metadata); // 返回文件位置 return s3FilePath; } /** * 用文件路徑獲取文件下載地址 * * @param path * @return */ public static String getDownloadFileFromS3(String path) { return s3.generatePresignedUrl(new GeneratePresignedUrlRequest(BUCKET_NAME, path)).toString(); } /** * 獲取S3Object對象 * * @param path * @return */ public static S3Object getS3Object(String path) { S3Object s3Object = s3.getObject(BUCKET_NAME, path); return s3Object; } }
S3Object 對象中有輸入流,可以使用創建文件。