JavaScript >> Javascript 文檔 >  >> Node.js

使用 Node.js 將文件上傳到 AWS S3

簡介

我們今天構建的許多軟件和 Web 應用程序都需要某種文件託管 - 圖像、發票、音頻文件等。存儲文件的傳統方式只是將它們保存在服務器的 HDD 上。但是,將文件保存到服務器的 HDD 會帶來一些限制,例如無法擴展、需要在使用前分配空間以及更高/不靈活的價格。更不用說,請求大量(可能很大)圖像確實會給服務器帶來壓力。

為了卸載服務器,開發人員開始使用 AWS S3、Google Cloud Storage 等存儲提供商託管文件。

在本文中,我們將向您展示如何編寫 Node.js 代碼來將文件上傳到 S3。

什麼是 S3?

S3,或簡單存儲服務 , 是 Amazon Web Services 提供的雲存儲服務 (AWS)。使用 S3,您可以託管任意數量的文件,同時只需為您使用的內容付費。

S3 還按客戶所在區域為客戶提供多區域託管,因此能夠以最小的延遲真正快速地提供請求的文件。

設置環境

AWS 憑證

要開始,您需要生成 AWS 安全密鑰訪問憑證 第一的。為此,請登錄您的 AWS 管理控制台 .

點擊你的用戶名:

然後選擇訪問鍵 -> 創建新的訪問密鑰

之後,您可以復制 Access Key ID秘密訪問密鑰 從這個窗口,或者您可以將其下載為 .CSV 文件:

創建 S3 存儲桶

現在讓我們創建一個具有適當訪問權限的 AWS S3 存儲桶。我們可以使用 AWS 管理控制台或使用 Node.js 來做到這一點。

要使用管理控制台創建 S3 存儲桶,請從服務菜單中選擇 S3 服務:

選擇“創建存儲桶” 並輸入您的存儲桶的名稱和您要託管存儲桶的區域。如果您已經知道大多數用戶來自哪個地區,那麼明智的做法是選擇盡可能接近他們所在地區的地區。這將確保來自服務器的文件將在更優化的時間範圍內提供服務。

您為存儲桶選擇的名稱應該是所有 AWS 用戶中唯一的名稱,因此如果名稱不可用,請嘗試使用新名稱:

按照嚮導操作並根據您的要求配置權限和其他設置。

要使用 Node.js 創建存儲桶,我們首先必須設置我們的開發環境。

開發環境

那麼現在讓我們通過配置一個新的 Node.js 項目來開始我們的示例:

$ npm init

要開始在 Node.js 中使用任何 AWS 雲服務,我們必須安裝 AWS SDK (系統開發套件)。

使用您喜歡的包管理器安裝它 - 我們將使用 npm

$ npm i --save aws-sdk

實現

創建 S3 存儲桶

如果您已經手動創建了存儲桶,則可以跳過此部分。但如果沒有,讓我們創建一個文件,例如 create-bucket.js 在你的項目目錄中。

導入 aws-sdk 庫來訪問您的 S3 存儲桶:

const AWS = require('aws-sdk');

現在,讓我們定義三個常量來存儲 ID , SECRET , 和 BUCKET_NAME .這些用於識別和訪問我們的存儲桶:

// Enter copied or downloaded access ID and secret key here
const ID = '';
const SECRET = '';

// The name of the bucket that you have created
const BUCKET_NAME = 'test-bucket';

現在,我們需要通過傳遞訪問密鑰來初始化 S3 接口:

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

const s3 = new AWS.S3({
    accessKeyId: ID,
    secretAccessKey: SECRET
});

S3接口初始化成功後,我們就可以繼續創建bucket了:

const params = {
    Bucket: BUCKET_NAME,
    CreateBucketConfiguration: {
        // Set your region here
        LocationConstraint: "eu-west-1"
    }
};

s3.createBucket(params, function(err, data) {
    if (err) console.log(err, err.stack);
    else console.log('Bucket Created Successfully', data.Location);
});

此時我們可以運行代碼,測試一下bucket是否是在雲端創建的:

$ node create-bucket.js

如果代碼執行成功,您應該會看到成功消息,然後是輸出中的存儲桶地址:

Bucket Created Successfully http://test-bucket-2415soig.s3.amazonaws.com/

您可以訪問您的 S3 儀表板並確保已創建存儲桶:

要查看完整的地區列表和其他參數,請查看官方文檔。

上傳文件

至此,我們來實現文件上傳功能。在一個新文件中,例如upload.js , 導入 aws-sdk 庫來訪問您的 S3 存儲桶和 fs 從您的計算機讀取文件的模塊:

const fs = require('fs');
const AWS = require('aws-sdk');

我們需要定義三個常量來存儲ID , SECRET , 和 BUCKET_NAME 並像之前一樣初始化 S3 客戶端。

現在,讓我們創建一個接受 fileName 的函數 參數,代表我們要上傳的文件:

const uploadFile = (fileName) => {
    // Read content from the file
    const fileContent = fs.readFileSync(fileName);

    // Setting up S3 upload parameters
    const params = {
        Bucket: BUCKET_NAME,
        Key: 'cat.jpg', // File name you want to save as in S3
        Body: fileContent
    };

    // Uploading files to the bucket
    s3.upload(params, function(err, data) {
        if (err) {
            throw err;
        }
        console.log(`File uploaded successfully. ${data.Location}`);
    });
};

在上傳文件之前,我們需要將其內容作為緩衝區讀取。閱讀後,我們可以定義文件上傳所需的參數,例如Bucket , Key , 和 Body .

除了這三個參數之外,還有一長串其他可選參數。要了解您可以在上傳時為文件定義的內容,以下是一些有用的內容:

  • StorageClass :定義要存儲對象的類。 S3 旨在提供快速文件服務。但是如果不經常訪問文件,您可以使用不同的存儲類。例如,如果您有幾乎不被觸及的文件,您可以存儲在“S3 Glacier Storage”中,與“S3 Standard Storage”相比,價格非常低。但是,如果您需要訪問這些文件,並且受不同的服務級別協議覆蓋,訪問這些文件將需要更多時間。
  • ContentType :設置圖像 MIME 類型。默認類型將是“二進制/八位字節流”。添加諸如“image/jpeg”之類的 MIME 類型將有助於瀏覽器和其他 HTTP 客戶端識別文件的類型。
  • ContentLength :以字節為單位設置正文的大小,如果正文大小無法自動確定,這會派上用場。
  • ContentLanguage :設置此參數以定義內容使用的語言。這也將幫助 HTTP 客戶端識別或翻譯內容。

對於 Bucket 參數,我們將使用我們的存儲桶名稱,而對於 Key 參數我們將添加我們要保存為的文件名,對於 Body 參數,我們將使用 fileContent .

完成後,我們可以通過將文件名傳遞給函數來上傳任何文件:

uploadFile('cat.jpg');

您可以將“cat.jpg”替換為與代碼存在於同一目錄中的文件名、相對文件路徑或絕對文件路徑。

至此,我們可以運行代碼並測試一下是否有效:

$ node upload.js

如果一切正常,您應該會看到如下所示的輸出,其中包含指向您的文件的鏈接,該文件存儲在 data.Location 中 :

File uploaded successfully. https://test-bucket-1242tsr.s3.ap-northeast-2.amazonaws.com/cat.jpg

如果有任何錯誤,它也應該顯示在控制台上。

此外,您可以轉到 AWS 管理控制台中的存儲桶並確保文件已上傳。

結論

為了卸載我們的應用程序服務器,開發人員的一個流行選擇是使用 AWS S3、Google Cloud Storage 等存儲提供商託管文件。我們製作了一個非常簡單的 Node.js 應用程序,它使用其接口通過以下方式處理文件上傳到 S3 aws-sdk 模塊。

根據您的要求,您還可以使用控制台配置對存儲桶或文件的公開訪問。

如果您想像往常一樣使用代碼,可以在 GitHub 的此 Gist 中找到它。


Tutorial JavaScript 教程
  1. 如何分析和獲取 Javascript 性能

  2. 上鉤:useState()

  3. 設計節播客 #12:ZURB、jQuery UI 和 Charlie The Unicorn

  4. Bootstrap vs Semantic UI vs Bulma for VueJS

  5. 函數式 JavaScript 中的柯里化初學者指南

  6. Typescript 中的遞歸 React 組件

  7. 如何通過熨斗學校的軟件工程技術面試

  1. 在 Next.js + Tailwind 中加載和使用 Google 字體的最佳方式

  2. 用 JS 跟踪鼠標速度

  3. Vanilla Javascript 組件模式

  4. JWT 客戶端認證終極指南(停止使用本地存儲!!!)

  5. N|Solid 中的內存異常檢測 [5/10] Node 的最佳 APM,逐層

  6. 如何 Dockerize 一個 NodeJs 應用程序

  7. 如何使用 React Native AsyncStorage

  1. 我從#100DaysOfGatbsy 挑戰中學到了什麼

  2. 使用 React 和 AWS Amplify 實現無服務器第 4 部分:託管

  3. 反應式函數式編程簡介

  4. Angular:使用 *ngFor 渲染部分列表數據