当前位置:   article > 正文

分享一下:上传文件到亚马逊的S3,并从指定桶里面拉取文件_spring boot 上传文件到amazon s3

spring boot 上传文件到amazon s3

这里给出两种方法 

后端Java

  1. 首先看AWS s3 (这里不放图了)

登录你的AWS   通过账号密码,进入s3 ,   并在设置-》安全凭证里面 创建一个密钥  (这个是访问密钥,不是你的登录账号和密码)

创建一个桶,记住你创建的桶名称   因为后面访问的时候需要  桶名称

咱们 上传文件需要   3个参数

 访问密钥    和  桶名称

  1. 打开你的idea   

  •  2.1  导入依赖

  1. <dependency>
  2.     <groupId>software.amazon.awssdk</groupId>
  3.     <artifactId>s3</artifactId>
  4. </dependency>
  5. <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
  6. <dependency>
  7.     <groupId>com.amazonaws</groupId>
  8.     <artifactId>aws-java-sdk-s3</artifactId>
  9.     <version>1.12.523</version>
  10. </dependency>
  • 2.2 创建一个测试的类

  1. package com.gupaoedu;
  2. import java.io.*;
  3. import com.amazonaws.auth.AWSCredentials;
  4. import com.amazonaws.auth.BasicAWSCredentials;
  5. import com.amazonaws.regions.Region;
  6. import com.amazonaws.regions.Regions;
  7. import com.amazonaws.services.s3.AmazonS3;
  8. import com.amazonaws.services.s3.AmazonS3Client;
  9. import com.amazonaws.services.s3.model.*;
  10. import com.amazonaws.services.s3.transfer.TransferManager;
  11. import com.amazonaws.services.s3.transfer.Upload;
  12. import org.springframework.stereotype.Service;
  13. /**
  14.  * @author DELL
  15.  * @Desc S3上传文件客户端
  16.  */
  17. @Service
  18. public class TestType {
  19. //访问密钥 的安全凭证中 找 没有则创建一个
  20.     private static String AWS_ACCESS_KEY = "*****";
  21.     private static String AWS_SECRET_KEY = "*****";
  22.     private static final String BUCKETNAME = "visa-application-system"; //桶名
  23.     private static AmazonS3 s3;
  24.     private static TransferManager tx;
  25.     /**
  26.      * 通过在代码中包含 access key id 和 secret access key 连接 aws
  27.      * @throws Exception
  28.      */
  29.     private static void init_with_key() throws Exception {
  30.         AWSCredentials credentials = null;
  31.         credentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
  32.         s3 = new AmazonS3Client(credentials);
  33.         Region usWest2 = Region.getRegion(Regions.AP_NORTHEAST_1); // 你的时区
  34.         s3.setRegion(usWest2);
  35.         tx = new TransferManager(s3);
  36.     }
  37.     /**
  38.      * 上传一个本地文件(对应位置为path)上传到名为bucketName的bucket
  39.      * @param path
  40.      * @param bucketName
  41.      */
  42.     private static boolean uploadFileToBucket(String bucketName,String path) {
  43.         // 通过你传入的文件路径  打开你的本地文件
  44.         File fileToUpload = new File(path);
  45.         if(fileToUpload.exists() == false) {
  46.             System.out.println(path + " not exists!");
  47.             return false;
  48.         }
  49.         // 桶名、     存入桶里面的文件名字(自定义)(如果时多级目录  传入全路径)、   通过你传入的文件路径打开的文件
  50.         PutObjectRequest request = new PutObjectRequest(bucketName,fileToUpload.getName(),fileToUpload);
  51.         Upload upload = tx.upload(request);
  52.         while((int)upload.getProgress().getPercentTransferred() < 100) {
  53.             try {
  54.                 Thread.sleep(1000);
  55.             } catch (InterruptedException e) {
  56.                 // TODO Auto-generated catch block
  57.                 e.printStackTrace();
  58.                 return false;
  59.             }
  60.         }
  61.         System.out.println(path + " upload succeed!");
  62.         return true;
  63.     }
  64. // 传入要拉去的文件名
  65.     private static Boolean downloadrelease(String bucketname,String filename,String windowspath) throws IOException {
  66.         //  下载文件 ( 桶名,文件夹名+文件名 ) 因为这是直接在桶下面  所以 只有文件名
  67.         // 如果你是多级目录 需要 传入你的文件夹加你的文件名    例如:  test/file。pdf
  68.         S3Object s3Object = s3.getObject(new GetObjectRequest(bucketname,  filename));
  69.         if (s3Object != null) {
  70.             InputStream inputStream = null;
  71.             FileOutputStream fileOutputStream = null;
  72.             byte[] data = null;
  73.             try {
  74.                 // 通过你 要下载桶中文件名称( 可以传多级目录   但需要 截取要下载到本地的文件名   之后和你要下载的本地路径相拼接)
  75.                 File file = new File(windowspath+"\\"+filename);
  76.                 if (!file.exists()) {
  77.                     file.createNewFile();
  78.                 }
  79.                 //获取S3object对象文本信息
  80.                 inputStream = s3Object.getObjectContent();
  81.                 data = new byte[inputStream.available()];
  82.                 int len = 0;
  83.                 fileOutputStream = new FileOutputStream(file.getPath());
  84.                 while ((len = inputStream.read(data)) != -1) {
  85.                     fileOutputStream.write(data, 0, len);
  86.                 }
  87.                 System.out.println(("*********下载文件成功!*********"));
  88.             } catch (IOException e) {
  89.                 e.printStackTrace();
  90.             } finally {
  91.                 if (fileOutputStream != null) {
  92.                     try {
  93.                         fileOutputStream.close();//文件流关闭
  94.                     } catch (IOException e) {
  95.                         e.printStackTrace();
  96.                     }
  97.                 }
  98.                 if (inputStream != null) {
  99.                     try {
  100.                         inputStream.close();//文件流关闭
  101.                     } catch (IOException e) {
  102.                         e.printStackTrace();
  103.                     }
  104.                 }
  105.             }
  106.         }
  107.         return true;
  108.     }
  109.     public static void main(String[] args) throws Exception {
  110.         // 根据你的 访问密匙  初始化S3 对象
  111.         init_with_key();
  112.         //传入 你要上传 到的桶名称,     和你上传的本地文件全路径
  113.         boolean b = uploadFileToBucket(BUCKETNAME, "C:\\Users\\Administrator\\Desktop\\代码\\file2023-08-28.pdf");
  114.         if(b){
  115.             System.out.println("上传成功");
  116.         }else {
  117.             System.out.println("上传失败");
  118.         }
  119.          /*
  120.          *
  121.          * 下载文件 这里我只传入了三个参数
  122.          *  1,桶名称
  123.          * 2.  桶中的文件名称     或多级文件目录 文件名称例如    files/pdfs/file.pdf
  124.          * 3. 下载到本地路径
  125.          * */
  126.         Boolean downloadrelease = downloadrelease(BUCKETNAME, "file2023-08-28.pdf", "C:\\Users\\Administrator\\Desktop\\代码");
  127.         if(downloadrelease){
  128.             System.out.println("下载成功");
  129.         }else {
  130.             System.out.println("下载失败");
  131.         }
  132.         System.exit(0);
  133.     }
  134. }
  1. 2.3.其他的一些方法

    1. /**
    2. * 用于创建一个名为bucketName的s3 bucket
    3. * @param bucketName
    4. */
    5. private void createBucket(String bucketName) {
    6. if(s3.doesBucketExist(bucketName) == true) {
    7. System.out.println(bucketName + " already exist!");
    8. return;
    9. }
    10. System.out.println("creating " + bucketName + " ...");
    11. s3.createBucket(bucketName);
    12. System.out.println(bucketName + " has been created!");
    13. }
    14. /**
    15. * 列出名为bucketName的bucket里面的所有object
    16. * @param bucketName
    17. */
    18. private void listObjects(String bucketName) {
    19. System.out.println("Listing objects of " + bucketName);
    20. ObjectListing objectListing = s3.listObjects(bucketName);
    21. int objectNum = 0;
    22. for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
    23. System.out.println(" - " + objectSummary.getKey());
    24. objectNum ++;
    25. }
    26. System.out.println("total " + objectNum + " object(s).");
    27. }
    28. /**
    29. * 判断名为bucketName的bucket里面是否有一个名为key的object
    30. * @param bucketName
    31. * @param key
    32. * @return
    33. */
    34. private boolean isObjectExit(String bucketName, String key) {
    35. int len = key.length();
    36. ObjectListing objectListing = s3.listObjects(bucketName);
    37. String s = new String();
    38. for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
    39. s = objectSummary.getKey();
    40. int slen = s.length();
    41. if(len == slen) {
    42. int i;
    43. for(i=0;i<len;i++) {
    44. if(s.charAt(i) != key.charAt(i)) {
    45. break;
    46. }
    47. }
    48. if(i == len) {
    49. return true;
    50. }
    51. }
    52. }
    53. return false;
    54. }
    55. /**
    56. * 在本地创建一个名为filename的文件,输入一些信息后,将其传到名为bucketName的s3 bucket里面去
    57. * @param bucketName
    58. * @param filename
    59. * @throws IOException
    60. */
    61. private void createSampleFile(String bucketName, String filename) throws IOException {
    62. if(isObjectExit(bucketName, filename) == true) {
    63. System.out.println(filename +" already exists in " + bucketName + "!");
    64. return;
    65. }
    66. System.out.println("creating file " + filename);
    67. File file = new File(filename);
    68. file.deleteOnExit();
    69. Writer writer = new OutputStreamWriter(new FileOutputStream(file));
    70. writer.write("abcdefghijklmnopqrstuvwxyz\n");
    71. writer.write("01234567890112345678901234\n");
    72. writer.write("!@#$%^&*()-=[]{};':',.<>/?\n");
    73. writer.write("01234567890112345678901234\n");
    74. writer.write("abcdefghijklmnopqrstuvwxyz\n");
    75. writer.close();
    76. s3.putObject(bucketName, filename, file);
    77. System.out.println("create sample file " + filename + " succeed!");
    78. }
    79. /**
    80. * 输出"s3://"+bucketname+"/"key对应的object对应的信息
    81. * @param bucketName
    82. * @param key
    83. */
    84. private static String showContentOfAnObject(String bucketName, String key) {
    85. S3Object object = s3.getObject(new GetObjectRequest(bucketName, key));
    86. InputStream input = object.getObjectContent();
    87. return object.getKey();
    88. // BufferedReader reader = new BufferedReader(new InputStreamReader(input));
    89. // try {
    90. // while (true) {
    91. // String line = reader.readLine();
    92. // if (line == null) {
    93. // break;
    94. // }
    95. // System.out.println(" " + line);
    96. // }
    97. // System.out.println();
    98. // } catch (IOException e) {
    99. // e.printStackTrace();
    100. // }
    101. }
    102. /**
    103. * 输出"s3://"+bucketname+"/"key对应的object对应的信息(这个object对应的文件时gzip格式的)
    104. * @param bucketName
    105. * @param key
    106. */
    107. private void showContentOfAnGzipObject(String bucketName, String key) {
    108. try {
    109. S3Object object = s3.getObject(new GetObjectRequest(bucketName, key));
    110. InputStream input = new GZIPInputStream(object.getObjectContent());
    111. BufferedReader reader = new BufferedReader(new InputStreamReader(input));
    112. while (true) {
    113. String line = reader.readLine();
    114. if (line == null) {
    115. break;
    116. }
    117. System.out.println(" " + line);
    118. }
    119. System.out.println();
    120. } catch (IOException e) {
    121. e.printStackTrace();
    122. }
    123. }
    124. /**
    125. * 删除一个名为bucketName的bucket
    126. * @param bucketName
    127. */
    128. private void deleteBucket(String bucketName) {
    129. if(s3.doesBucketExist(bucketName) == false) {
    130. System.out.println(bucketName + " does not exists!");
    131. return;
    132. }
    133. System.out.println("deleting " + bucketName + " ...");
    134. ObjectListing objectListing = s3.listObjects(bucketName);
    135. for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
    136. String key = objectSummary.getKey();
    137. s3.deleteObject(bucketName, key);
    138. }
    139. s3.deleteBucket(bucketName);
    140. System.out.println(bucketName + " has been deleted!");
    141. }
    142. /**
    143. * 删除名为bucketName的bucket里面所有key的前缀和prefix匹配的object
    144. * @param bucketName
    145. * @param prefix
    146. */
    147. private void deleteObjectsWithPrefix(String bucketName, String prefix) {
    148. if(s3.doesBucketExist(bucketName) == false) {
    149. System.out.println(bucketName + " does not exists!");
    150. return;
    151. }
    152. System.out.println("deleting " + prefix +"* in " + bucketName + " ...");
    153. int pre_len = prefix.length();
    154. ObjectListing objectListing = s3.listObjects(bucketName);
    155. for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
    156. String key = objectSummary.getKey();
    157. int len = key.length();
    158. if(len < pre_len) {
    159. continue;
    160. }
    161. int i;
    162. for(i=0;i<pre_len;i++) {
    163. if(key.charAt(i) != prefix.charAt(i)) {
    164. break;
    165. }
    166. }
    167. if(i < pre_len) {
    168. continue;
    169. }
    170. s3.deleteObject(bucketName, key);
    171. }
    172. System.out.println("All " + prefix + "* deleted!");
    173. }
    174. /**
    175. * 列出我的s3上所有的bucket的名字
    176. */
    177. private void listBuckets() {
    178. System.out.println("Listing buckets");
    179. int bucketNum = 0;
    180. for(Bucket bucket : s3.listBuckets()) {
    181. System.out.println(" - " + bucket.getName());
    182. bucketNum ++;
    183. }
    184. System.out.println("total " + bucketNum + " bucket(s).");
    185. }
    186. /**
    187. * 在aws上创建一个目录
    188. * @param bucketName
    189. * @param folderId
    190. */
    191. private static String createFolder(String bucketName, Integer folderId) {
    192. // Create metadata for my folder & set content-length to 0
    193. ObjectMetadata metadata = new ObjectMetadata();
    194. metadata.setContentLength(0);
    195. // Create empty content
    196. InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
    197. // Create a PutObjectRequest passing the foldername suffixed by /
    198. String folderName=FOLDERNameLIST+folderId+"/"; // 创建文件目录
    199. PutObjectRequest putObjectRequest =
    200. new PutObjectRequest(bucketName, folderName,
    201. emptyContent, metadata);
    202. // Send request to S3 to create folder
    203. s3.putObject(putObjectRequest);
    204. return folderName;
    205. }

    前端Vue  下载(不是上传)

1. 首先,确保已安装AWS SDK for JavaScript。

npm install aws-sdk

2.导入包

  1. // 在<script> 标签中 导入 前提是 你把aws install 在你的项目中
  2. import AWS from 'aws-sdk';

3. 定义单机事件方法

  1. // 在vue method 代码块中 定义 单机按钮 调用方法
  2. downloadImage(filename) {
  3. // 配置AWS SDK
  4. AWS.config.update({
  5. // 你的访问密钥
  6. accessKeyId: '******',
  7. secretAccessKey: '*****',
  8. region: 'ap-northeast-1' // 你的时区
  9. });
  10. const s3 = new AWS.S3();
  11. // 桶名
  12. const bucketName = '***';
  13. //文件名 或者文件全路径名 桶名/ [文件夹名/] *.*
  14. const key = '***/*.*';
  15. // 创建下载链接
  16. const params = {
  17. Bucket: bucketName,
  18. Key: key
  19. };
  20. s3.getSignedUrl('getObject', params, (err, url) => {
  21. if (err) {
  22. console.error('无法生成签名URL:', err);
  23. } else {
  24. // 使用生成的URL下载图片
  25. window.open(url);
  26. }
  27. });
  28. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/285783
推荐阅读
相关标签
  

闽ICP备14008679号