zoukankan      html  css  js  c++  java
  • [AWS] Signed URL partten

    For example client want to upload some large file to our FileSotre, for example S3.

    Normally we might thinking about 

    1. Send file to our server
    2. Our server save file to S3

    But Better way actually is:

    1. Client send request to server saying that we want to save file to S3
    2. Server make hand shake with S3 and return a signed url which client can use directly
    3. Client save the file directly to S3

    workflow:

    • SignedURLs allow clients to send and receive data by directly communicating with the file store. This saves the server from using its bandwidth to serve as the intermediary that transmits data to and from the client. This is faster for clients as well.

    aws.ts:

    import AWS = require("aws-sdk");
    import { config } from "./config/config";
    
    const c = config.dev;
    
    //Configure AWS
    var credentials = new AWS.SharedIniFileCredentials({ profile: c.aws_profile });
    AWS.config.credentials = credentials;
    console.log("credentials", credentials);
    
    export const s3 = new AWS.S3({
      signatureVersion: "v4",
      region: c.aws_region,
      params: { Bucket: c.aws_media_bucket },
    });
    
    /* getGetSignedUrl generates an aws signed url to retreive an item
     * @Params
     *    key: string - the filename to be put into the s3 bucket
     * @Returns:
     *    a url as a string
     */
    export function getGetSignedUrl(key: string): string {
      const signedUrlExpireSeconds = 60 * 5;
    
      const url = s3.getSignedUrl("getObject", {
        Bucket: c.aws_media_bucket,
        Key: key,
        Expires: signedUrlExpireSeconds,
      });
    
      return url;
    }
    
    /* getPutSignedUrl generates an aws signed url to put an item
     * @Params
     *    key: string - the filename to be retreived from s3 bucket
     * @Returns:
     *    a url as a string
     */
    export function getPutSignedUrl(key: string) {
      const signedUrlExpireSeconds = 60 * 5;
    
      const url = s3.getSignedUrl("putObject", {
        Bucket: c.aws_media_bucket,
        Key: key,
        Expires: signedUrlExpireSeconds,
      });
    
      return url;
    }

    endpoint to get a singed url:

    import * as AWS from "../../../../aws";
    ...
    // Get a signed url to put a new item in the bucket
    router.get(
      "/signed-url/:fileName",
      requireAuth,
      async (req: Request, res: Response) => {
        let { fileName } = req.params;
        const url = AWS.getPutSignedUrl(fileName);
        res.status(201).send({ url: url });
      }
    );

    Test in Postman:

    Call the endpoint to get a signed url:

    It response url back in json:

    {
        "url": "https://myfirstrds-dev.s3.amazonaws.com/image.jpeg?X-Amz-Algorithm=...=host"
    }

    Copy this url set:

    • PUT request
    • Header Content-type: "image/jpeg"
    • Body: "binary" - select your image

    If successed, the image will be uploaded to S3.

  • 相关阅读:
    归并排序
    1、钢条切割问题
    webdriver高级应用- 使用日志模块记录测试过程中的信息
    webdriver高级应用- 测试过程中发生异常或断言失败时进行屏幕截图
    webdriver高级应用- 浏览器中新开标签页(Tab)
    webdriver高级应用- 高亮显示正在操作的页面元素
    webdriver高级应用- 精确比较页面截图图片
    webdriver高级应用- 操作富文本框
    webdriver高级应用- 启动带有用户配置信息的firefox浏览器窗口
    webdriver高级应用- 操作日期控件
  • 原文地址:https://www.cnblogs.com/Answer1215/p/14562101.html
Copyright © 2011-2022 走看看