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

这里给出两种方法 

后端Java

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

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

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

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

 访问密钥    和  桶名称

  1. 打开你的idea   

  •  2.1  导入依赖

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.12.523</version>
</dependency>
  • 2.2 创建一个测试的类

package com.gupaoedu;

import java.io.*;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.*;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.Upload;
import org.springframework.stereotype.Service;


/**
 * @author DELL
 * @Desc S3上传文件客户端
 */
@Service
public class TestType {
    //访问密钥 的安全凭证中 找  没有则创建一个
    private static String AWS_ACCESS_KEY = "*****";
    private static String AWS_SECRET_KEY = "*****";
    private static final String BUCKETNAME = "visa-application-system"; //桶名
    private static AmazonS3 s3;
    private static TransferManager tx;



    /**
     * 通过在代码中包含 access key id 和 secret access key 连接 aws
     * @throws Exception
     */
    private static void init_with_key() throws Exception {
        AWSCredentials credentials = null;
        credentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
        s3 = new AmazonS3Client(credentials);
        Region usWest2 = Region.getRegion(Regions.AP_NORTHEAST_1); // 你的时区
        s3.setRegion(usWest2);
        tx = new TransferManager(s3);
    }
    /**
     * 上传一个本地文件(对应位置为path)上传到名为bucketName的bucket
     * @param path
     * @param bucketName
     */
    private static boolean uploadFileToBucket(String bucketName,String path) {
        // 通过你传入的文件路径  打开你的本地文件
        File fileToUpload = new File(path);
        if(fileToUpload.exists() == false) {
            System.out.println(path + " not exists!");
            return false;
        }
        // 桶名、     存入桶里面的文件名字(自定义)(如果时多级目录  传入全路径)、   通过你传入的文件路径打开的文件
        PutObjectRequest request = new PutObjectRequest(bucketName,fileToUpload.getName(),fileToUpload);
        Upload upload = tx.upload(request);
        while((int)upload.getProgress().getPercentTransferred() < 100) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return false;
            }
        }
        System.out.println(path + " upload succeed!");
        return true;
    }

// 传入要拉去的文件名
    private static Boolean downloadrelease(String bucketname,String filename,String windowspath) throws IOException {
        //  下载文件 ( 桶名,文件夹名+文件名 ) 因为这是直接在桶下面  所以 只有文件名
        // 如果你是多级目录 需要 传入你的文件夹加你的文件名    例如:  test/file。pdf
        S3Object s3Object = s3.getObject(new GetObjectRequest(bucketname,  filename));
        if (s3Object != null) {
            InputStream inputStream = null;
            FileOutputStream fileOutputStream = null;
            byte[] data = null;
            try {
                // 通过你 要下载桶中文件名称( 可以传多级目录   但需要 截取要下载到本地的文件名   之后和你要下载的本地路径相拼接)
                File file = new File(windowspath+"\\"+filename);

                if (!file.exists()) {
                    file.createNewFile();
                }
                //获取S3object对象文本信息
                inputStream = s3Object.getObjectContent();
                data = new byte[inputStream.available()];
                int len = 0;
                fileOutputStream = new FileOutputStream(file.getPath());

                while ((len = inputStream.read(data)) != -1) {
                    fileOutputStream.write(data, 0, len);
                }
                System.out.println(("*********下载文件成功!*********"));
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fileOutputStream != null) {
                    try {
                        fileOutputStream.close();//文件流关闭
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (inputStream != null) {
                    try {
                        inputStream.close();//文件流关闭
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }
        return true;
    }

    public static void main(String[] args) throws Exception {
        // 根据你的 访问密匙  初始化S3 对象
        init_with_key();

        //传入 你要上传 到的桶名称,     和你上传的本地文件全路径
        boolean b = uploadFileToBucket(BUCKETNAME, "C:\\Users\\Administrator\\Desktop\\代码\\file2023-08-28.pdf");
        if(b){
            System.out.println("上传成功");
        }else {
            System.out.println("上传失败");
        }

         /*
         *
         * 下载文件 这里我只传入了三个参数
         *  1,桶名称
         * 2.  桶中的文件名称     或多级文件目录 文件名称例如    files/pdfs/file.pdf
         * 3. 下载到本地路径
         * */
        Boolean downloadrelease = downloadrelease(BUCKETNAME, "file2023-08-28.pdf", "C:\\Users\\Administrator\\Desktop\\代码");
        if(downloadrelease){
            System.out.println("下载成功");
        }else {
            System.out.println("下载失败");
        }

        System.exit(0);
    }


}
  1. 2.3.其他的一些方法

  2.  /**
         * 用于创建一个名为bucketName的s3 bucket
         * @param bucketName
         */
        private  void createBucket(String bucketName) {
            if(s3.doesBucketExist(bucketName) == true) {
                System.out.println(bucketName + " already exist!");
                return;
            }
            System.out.println("creating " + bucketName + " ...");
            s3.createBucket(bucketName);
            System.out.println(bucketName + " has been created!");
        }
    
        /**
         * 列出名为bucketName的bucket里面的所有object
         * @param bucketName
         */
        private  void listObjects(String bucketName) {
            System.out.println("Listing objects of " + bucketName);
            ObjectListing objectListing = s3.listObjects(bucketName);
            int objectNum = 0;
            for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                System.out.println(" - " + objectSummary.getKey());
                objectNum ++;
            }
            System.out.println("total " + objectNum + " object(s).");
        }
    
        /**
         * 判断名为bucketName的bucket里面是否有一个名为key的object
         * @param bucketName
         * @param key
         * @return
         */
        private  boolean isObjectExit(String bucketName, String key) {
            int len = key.length();
            ObjectListing objectListing = s3.listObjects(bucketName);
            String s = new String();
            for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                s = objectSummary.getKey();
                int slen = s.length();
                if(len == slen) {
                    int i;
                    for(i=0;i<len;i++) {
                        if(s.charAt(i) != key.charAt(i)) {
                            break;
                        }
                    }
                    if(i == len) {
                        return true;
                    }
                }
            }
            return false;
        }
    
        /**
         * 在本地创建一个名为filename的文件,输入一些信息后,将其传到名为bucketName的s3 bucket里面去
         * @param bucketName
         * @param filename
         * @throws IOException
         */
        private  void createSampleFile(String bucketName, String filename) throws IOException {
            if(isObjectExit(bucketName, filename) == true) {
                System.out.println(filename +" already exists in " + bucketName + "!");
                return;
            }
            System.out.println("creating file " + filename);
            File file = new File(filename);
            file.deleteOnExit();
    
            Writer writer = new OutputStreamWriter(new FileOutputStream(file));
            writer.write("abcdefghijklmnopqrstuvwxyz\n");
            writer.write("01234567890112345678901234\n");
            writer.write("!@#$%^&*()-=[]{};':',.<>/?\n");
            writer.write("01234567890112345678901234\n");
            writer.write("abcdefghijklmnopqrstuvwxyz\n");
            writer.close();
    
            s3.putObject(bucketName, filename, file);
            System.out.println("create sample file " + filename + " succeed!");
        }
    
        /**
         * 输出"s3://"+bucketname+"/"key对应的object对应的信息
         * @param bucketName
         * @param key
         */
        private static String showContentOfAnObject(String bucketName, String key) {
    
            S3Object object = s3.getObject(new GetObjectRequest(bucketName, key));
            InputStream input = object.getObjectContent();
            return object.getKey();
    //        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
    //        try {
    //            while (true) {
    //                String line = reader.readLine();
    //                if (line == null) {
    //                    break;
    //                }
    //                System.out.println("    " + line);
    //            }
    //            System.out.println();
    //        } catch (IOException e) {
    //            e.printStackTrace();
    //        }
        }
    
        /**
         * 输出"s3://"+bucketname+"/"key对应的object对应的信息(这个object对应的文件时gzip格式的)
         * @param bucketName
         * @param key
         */
        private  void showContentOfAnGzipObject(String bucketName, String key) {
            try {
                S3Object object = s3.getObject(new GetObjectRequest(bucketName, key));
                InputStream input = new GZIPInputStream(object.getObjectContent());
                BufferedReader reader = new BufferedReader(new InputStreamReader(input));
    
                while (true) {
                    String line = reader.readLine();
                    if (line == null) {
                        break;
                    }
                    System.out.println("    " + line);
                }
                System.out.println();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 删除一个名为bucketName的bucket
         * @param bucketName
         */
        private  void deleteBucket(String bucketName) {
            if(s3.doesBucketExist(bucketName) == false) {
                System.out.println(bucketName + " does not exists!");
                return;
            }
            System.out.println("deleting " + bucketName + " ...");
            ObjectListing objectListing = s3.listObjects(bucketName);
            for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                String key = objectSummary.getKey();
                s3.deleteObject(bucketName, key);
            }
            s3.deleteBucket(bucketName);
            System.out.println(bucketName + " has been deleted!");
        }
    
        /**
         * 删除名为bucketName的bucket里面所有key的前缀和prefix匹配的object
         * @param bucketName
         * @param prefix
         */
        private  void deleteObjectsWithPrefix(String bucketName, String prefix) {
            if(s3.doesBucketExist(bucketName) == false) {
                System.out.println(bucketName + " does not exists!");
                return;
            }
            System.out.println("deleting " + prefix +"* in " + bucketName + " ...");
            int pre_len = prefix.length();
            ObjectListing objectListing = s3.listObjects(bucketName);
            for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                String key = objectSummary.getKey();
                int len = key.length();
                if(len < pre_len) {
                    continue;
                }
                int i;
                for(i=0;i<pre_len;i++) {
                    if(key.charAt(i) != prefix.charAt(i)) {
                        break;
                    }
                }
                if(i < pre_len) {
                    continue;
                }
                s3.deleteObject(bucketName, key);
            }
            System.out.println("All " + prefix + "* deleted!");
        }
    
    
        /**
         * 列出我的s3上所有的bucket的名字
         */
        private  void listBuckets() {
            System.out.println("Listing buckets");
            int bucketNum = 0;
            for(Bucket bucket : s3.listBuckets()) {
                System.out.println(" - " + bucket.getName());
                bucketNum ++;
            }
            System.out.println("total " + bucketNum + " bucket(s).");
        }
    
    
        /**
         * 在aws上创建一个目录
         * @param bucketName
         * @param folderId
         */
        private static String createFolder(String bucketName, Integer folderId) {
            // Create metadata for my folder & set content-length to 0
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(0);
            // Create empty content
            InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
            // Create a PutObjectRequest passing the foldername suffixed by /
            String folderName=FOLDERNameLIST+folderId+"/"; // 创建文件目录
            PutObjectRequest putObjectRequest =
                    new PutObjectRequest(bucketName, folderName,
                            emptyContent, metadata);
            // Send request to S3 to create folder
            s3.putObject(putObjectRequest);
            return folderName;
        }
    

    前端Vue  下载(不是上传)

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

npm install aws-sdk

2.导入包

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

3. 定义单机事件方法

// 在vue method 代码块中 定义  单机按钮   调用方法
 
downloadImage(filename) {
      // 配置AWS SDK
      AWS.config.update({
    // 你的访问密钥
        accessKeyId: '******',
        secretAccessKey: '*****',
        region: 'ap-northeast-1' // 你的时区
      });

      const s3 = new AWS.S3();
        // 桶名
      const bucketName = '***';
        //文件名    或者文件全路径名             桶名/ [文件夹名/] *.*
      const key = '***/*.*';
       
      // 创建下载链接
      const params = {
        Bucket: bucketName,
        Key: key
      };

      s3.getSignedUrl('getObject', params, (err, url) => {
        if (err) {
          console.error('无法生成签名URL:', err);
        } else {
          // 使用生成的URL下载图片
          window.open(url);
        }
      });
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值