AWS S3 实现预签名上传_aws 签名上传-程序员宅基地

技术标签: java  文件上传  aws  File  

步骤:

1、前端上传文件,将要上传的文件名称传到后台

2、后台通过该文件名称生成预上传URL返回前端

3、前端请求该URL,并携带文件上传至S3

后端代码

    /**
     * AWS预签名上传
     * @return
     */
    @GetMapping("/upload")
    public Object generatePreSignedUrl(String fileName){
        Map<String, Object> map = new HashMap<>();
        try {
            AWSCredentials awsCredentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
            AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(Regions.CN_NORTH_1)
                    .withCredentials(awsCredentialsProvider)
                    .build();
            java.util.Date expiration = new java.util.Date();
            long expTimeMillis = expiration.getTime();
            expTimeMillis += 1000 * 60 * 30;
            expiration.setTime(expTimeMillis);
            String name = fileName.substring(0,fileName.lastIndexOf("."));
            String fileType = fileName.substring(fileName.lastIndexOf("."));
            String prefixFileName = name+ "_"+String.valueOf(System.currentTimeMillis()).substring(6)+""+fileType;
            Review review = new Review();
            review.setName(name);
            GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(BUCKET_NAME, prefixFileName)
                    .withMethod(HttpMethod.PUT)
                    .withExpiration(expiration);
            URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
            if(url == null){
                return map;
            }
            // 文件访问地址
            StringBuilder urlImage = new StringBuilder();
            urlImage.append(url.getProtocol()).append("://").append(url.getHost()).
                    append(URLDecoder.decode(url.getPath(), "UTF-8"));
            // 预签名put地址
            StringBuilder preUrl = new StringBuilder();
            preUrl.append(url.getProtocol()).append("://").append(url.getHost()).
                        append(URLDecoder.decode(url.getFile(), "UTF-8"));
            map.put("preUrl",preUrl);
            map.put("urlImage",urlImage);
            return map;
        } catch (Exception e) {
            e.printStackTrace();
            return map;
        }
    }

前端代码

import axios from 'axios'
 
                axios.put(preUrl, fileList[0], {
                headers: {
                  'Content-Type': 'multipart/form-data'
                },
                onUploadProgress: progressEvent => {
                  let complete = (progressEvent.loaded / progressEvent.total * 100.).toFixed(2)
                  
                }
              })
                .then((res: any) => {
                  if (res.status == 200) {
                    console.log(res)
                  }
                }).catch(
                  err => {
                    console.log(err)
                  })

当然也可以直接后台就上传到AWS,后端代码为:

    private void uploadContent(String imageUrl){
        // Set the pre-signed URL to expire after one hour.
        java.util.Date expiration = new java.util.Date();
        long expTimeMillis = expiration.getTime();
        expTimeMillis += 1000 * 60 * 5;
        expiration.setTime(expTimeMillis);
        // Generate the pre-signed URL.
        String fileType = imageUrl.substring(imageUrl.lastIndexOf("."));
        // 上传s3不保存后缀,
        String prefixFileName = UUIDUtils.getUUID()+""+fileType;
        GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(BUCKET_NAME, prefixFileName)
                .withMethod( com.amazonaws.HttpMethod.PUT)
                .withExpiration(expiration);
        URL url = amazonS3.generatePresignedUrl(generatePresignedUrlRequest);
        log.info("Generate the pre-signed URL: "+url);
        // Create the connection and use it to upload the new object using the pre-signed URL.
        HttpsURLConnection connection = null;
        OutputStream out = null;
        InputStream inputStream = null;
        try {
            // 需要上传的网络图片转为流
            URL url1 = new URL(imageUrl);
            HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url1.openConnection();
            inputStream = httpsURLConnection.getInputStream();
            // 通过预签名url上传文件
            connection = (HttpsURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestMethod("PUT");
            out = connection.getOutputStream();
            byte[] arr = new byte[1024]; //该数组用来存入从输入文件中读取到的数据
            int len; //变量len用来存储每次读取数据后的返回值
            //while循环:每次从输入文件读取数据后,都写入到输出文件中
            while( ( len=inputStream.read(arr) ) != -1 ) {
                out.write( arr, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(out != null){
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

参考官方文档:Uploading objects using presigned URLs - Amazon Simple Storage Service

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43037478/article/details/118998706

智能推荐

linux中的伪终端编程,Linux中的伪终端编程-程序员宅基地

文章浏览阅读512次。如何操作伪终端:伪终端的使用是成对出现的,分为master 和 slaver主设备:/dev/ptmx (i850上的主设备名)从设备:动态生成:/dev/pts/0.......x功能:写入主设备的信息,可以从从设备上读出;写入从设备的信息,可以从主设备读出。用以实现对串口的多路复用。以下是测试代码Ubuntu 下的编译方法:gcc -Wall ptyhost.c -o ptyhost -uti..._linux c 伪终端编程openpty

Mac 安装 scipy 失败问题的 简单解决方案 manim依赖库 2021年05月_macos failed: scipy/stats/_hypotests_pythran.cpp-程序员宅基地

文章浏览阅读2.2k次。Mac 安装 scipy 失败问题的 简单解决方案 manim依赖库2021年05月问题描述:系统:macOS Big Surpython:系统自带3.8~2.3IDE:pycharm2021.1.1 (Professional Edition)安装numpy(1.20.3)正常,安装至scipy时,从最新版本1.63一直安装失败。尝试过升级pip,setuptools(56.2.0),wheel(0.36.2)后,仍然失败。解决方案:1.下载最新的pyt..._macos failed: scipy/stats/_hypotests_pythran.cpp

linux tail 查找字符串,Linux grep、tail命令的混合使用-程序员宅基地

文章浏览阅读3.3k次。grepLinux grep命令用于查找文件里符合条件的字符串。grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为"-",则grep指令会从标准输入设备读取数据。语法grep [-abcEFGhHilLnqrsvVwxy][-A][-B][-C][-d][-e][-..._tail 查找字符串

matlab隐含层个数设置,BP神经网络隐藏层节点数如何确定-程序员宅基地

文章浏览阅读3k次。新人求教:本人的输入矩阵为p,每一列为一个特征向量,每一行为一个样本,现在我想按列归一化,我自己写的用for循环逐列归一化,但是发现输出反归一化还原时不好处理,求老师们教教有没有一些函数的使用技巧能按列归一化后而且能使得能方便地反归一化得到输出。网络输入p、输出t见下:p =[ 695.50 1.60 2.06 38.00 31...._matlab中设置bp隐含层数量的代码

递归_计算 f(n)=f(n-1)+f(n-2)-程序员宅基地

文章浏览阅读3k次。题目:1 、1、2、3、5、8....计算103的值规律:f(n)=f(n-1)+f(n-2)算法shi_f(n)=f(n-1)+f(n-2)

java -cp JAVA_OPTS环境变量不起作用的处理方法_java_opts classpath-程序员宅基地

文章浏览阅读1.8k次。原因:JAVA_OPTS只对tomcat/weblogic等Web服务器中间件有效,以“java -cp [*.jar] test.Main”方式运行的不会去读取JAVA_OPTS,所以通过java -cp执行相关文件会报错。JAVA_OPTS在 tomcat/bin/catalina.sh或tomcat/bin/catalina.bat文件配置,这可配置java进程虚拟机的启动参数 。解决方案:1、如果在运行java类,需要设置Heap Size的话,需要如下方式:java -Xmx2048m_java_opts classpath

随便推点

给一个二值图,求出最大连通区域(可用深度优先和广度优先算法)_一张边界图,如何连通并二值化-程序员宅基地

文章浏览阅读3.7k次。转载自:https://www.codetd.com/article/6541194这个问题是我在SLAM求职宝典系列D2篇中遗留的问题,因为内容较多现在单独将其列出进行解答。本篇内容分为四个部分:目录(1)二值图(2)求最大连通区域的算法(3)代码实现,以及DFS 和BFS(4) OpenCV中连通域的求解(C++ & Python)..._一张边界图,如何连通并二值化

Pycharm启动慢、运行卡的解决办法_pycharm打开谷歌浏览器运行缓慢-程序员宅基地

文章浏览阅读1.6w次,点赞13次,收藏53次。前提:现在的电脑标配都 4G 以上内存了,不过很多IDE仍然是以低配电脑为标准,去配置软件占用硬件的程度因为内存会直接影响到软件的性能,如果pycharm启动慢和运行卡顿可以通过加大软件的运行内存。步骤/方法方法一:pycharm 菜单栏找到 ---- help ---- edit custom VM options…修改 pycharm64.exe.vmoptions 文件Xms..._pycharm打开谷歌浏览器运行缓慢

模糊综合评价模型原理及matlab实现_模糊综合评判--空气质量评估例题matlab-程序员宅基地

文章浏览阅读4w次,点赞149次,收藏886次。资料来源:微信公众号《数学建模学习交流》目录1. 概述2. 经典集合和模糊集合的基本概念2.1 经典集合和特征函数2.2 模糊集合和隶属函数3. 隶属函数的三种确定方法3.1 模糊统计法3.2 借助已有的客观尺度4. 应用:模糊综合评价(评判)4.1 评价问题概述4.2 一级模糊综合评价模型4.2.1 一级模糊综合评判模型在人事考核中的应用..._模糊综合评判--空气质量评估例题matlab

vue-router的push和replace的区别_vue饿router的push和replace-程序员宅基地

文章浏览阅读5.3w次,点赞15次,收藏58次。1.this.$router.push()描述:跳转到不同的url,但这个方法会向history栈添加一个记录,点击后退会返回到上一个页面。2.this.$router.replace()描述:同样是跳转到指定的url,但是这个方法不会向history里面添加新的记录,点击返回,会跳转到上上一个页面。上一个记录是不存在的。3.this.$router.go(n)相对于当前页面向..._vue饿router的push和replace

荣耀会不会没有鸿蒙系统,华为没有放弃荣耀手机老用户,都有机会鸿蒙系统,这下放心了吧...-程序员宅基地

文章浏览阅读140次。荣耀9X手机年内升级鸿蒙操作系统,为华为这个做法点赞自从新荣耀成立之后,鸿蒙操作系统的更新以及4月陆续从旗舰机开始开放,这个时候很多荣耀的老用户都慌了,那么我们怎么办可以不可以用,曾经荣耀CEO赵明说会遵循行业之间的相关规定,所以这也让荣耀手机是否可以用鸿蒙系统变得扑朔迷离,最近终于被实锤了,既然荣耀9X都可以升级,那么估计荣耀30系列、荣耀20系列应该都有机会的!IT之家3月12日消息 根据微博..._荣耀放弃鸿蒙系统

利用jxl实现excel导出_jxl导出xls前端进度条-程序员宅基地

文章浏览阅读2.1k次。【说明】1.点击导出,取前台现有的数据通过ajax传到后台,2.通过jxl生成服务器上的xls文件3.ajax成功之后转到download,也就是打开保存界面:【配置】1.使用了struts2的注解配置【代码】jsp: //导出 $('#exportBtn').click(function(){ var str = '';_jxl导出xls前端进度条

推荐文章

热门文章

相关标签