Node.jsを使用してファイルをオブジェクトストレージにアップロードする方法

提供:Dev Guides
移動先:案内検索

序章

オブジェクトストレージは、オーディオ、画像、テキスト、PDF、その他の種類の非構造化データなどの静的アセットを保存および提供するための一般的でスケーラブルな方法です。 クラウドプロバイダーは、動的なアプリケーションファイルとデータベースを保存するために使用される従来のローカルストレージまたはブロックストレージに加えて、オブジェクトストレージを提供します。 読むオブジェクトストレージと ブロックストレージユースケースと2つの違いについて学びます。

Spaces は、DigitalOceanが提供するシンプルなオブジェクトストレージサービスです。 コントロールパネルを介して保存されたファイルにログインおよびアップロード、管理、および削除できることに加えて、コマンドラインおよびSpacesAPIを介してDigitalOceanSpaceにアクセスすることもできます。

このチュートリアルでは、ユーザーがWebサイトのフロントエンドでフォームを送信することにより、DigitalOceanSpaceにファイルをアップロードできるようにするNode.jsアプリケーションを作成します。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • DigitalOcean Spaceと、アカウントへのアクセスキーおよびシークレットアクセスキー。 DigitalOceanスペースとAPIキーを作成する方法を読んで、DigitalOceanアカウントを起動して実行し、スペースを作成し、APIキーとシークレットを設定します。
  • コンピューターにインストールされているNode.jsとnpm。 Node.js Downloads にアクセスして、オペレーティングシステムに適したバージョンをインストールできます。

これで、DigitalOceanアカウント、アクセスキー付きのスペース、およびNode.jsとnpmがコンピューターにインストールされているはずです。

クレデンシャルファイルにアクセスキーを追加する

DigitalOceanSpacesはAmazonSimple Storage Service(S3) APIと互換性があり、Node.jsAWS SDKforJavaScriptを使用して作成したSpaceに接続します。

最初のステップは、 credentials ファイルを作成し、DigitalOceanSpaceの作成時に取得したアクセスキーとシークレットアクセスキーを配置することです。 このファイルは、MacおよびLinuxの場合は〜/ .aws / credentials に、Windowsの場合は C:\ Users \ USERNAME \ .aws \credentialsにあります。 以前にAWSクレデンシャルを保存したことがある場合は、複数のクレデンシャルセットの保持についてお読みください。

コマンドプロンプトを開き、 Users ディレクトリにいることを確認し、管理者のsudoユーザーにアクセスできることを確認し、を使用して.awsディレクトリを作成します]内部のcredentialsファイル。

sudo mkdir .aws && touch .aws/credentials

ファイルを開き、次のコードを中に貼り付けて、your_access_keyyour_secret_keyをそれぞれのキーに置き換えます。

資格情報

[default]
aws_access_key_id=your_access_key
aws_secret_access_key=your_secret_key

これで、AWS SDKを介したSpacesへのアクセスが認証され、アプリケーションの作成に進むことができます。

Node.jsの依存関係をインストールする

まず、Node.jsアプリケーションを配置するディレクトリを作成し、そのディレクトリに移動します。 このデモンストレーションでは、sitesディレクトリのspaces-node-appにプロジェクトを作成します。

mkdir sites/spaces-node-app && cd sites/spaces-node-app

プロジェクトの新しいpackage.jsonファイルを作成します。 以下のコードをファイルに貼り付けます。

package.json

{
  "name": "spaces-node-app",
  "version": "1.0.0",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "license": "MIT"
}

これは、アプリケーションの名前、バージョン番号、およびライセンスをリストした基本的なpackage.jsonファイルです。 scriptsフィールドでは、node server.jsの代わりにnpm startと入力して、Node.jsサーバーを実行できます。

npm installコマンドを使用してすべての依存関係をインストールし、その後にプロジェクト内の4つの依存関係の名前を続けます。

npm install aws-sdk express multer multer-s3

このコマンドを実行した後、package.jsonファイルを更新する必要があります。 これらの依存関係は、DigitalOcean Spaces APIへの接続、Webサーバーの作成、およびファイルのアップロードの処理に役立ちます。

  • aws-sdk — AWS SDK for JavaScriptを使用すると、JavaScriptAPIを介してS3にアクセスできます。
  • express — Expressは、サーバーを迅速かつ効率的にセットアップできるようにするWebフレームワークです。
  • multer — Multerは、ファイルのアップロードを処理するミドルウェアです。
  • multer-s3 — Multer S3は、ファイルのアップロードをS3オブジェクトストレージ(この場合はDigitalOcean Spaces)に拡張します。

プロジェクトの場所と依存関係を設定したので、サーバービューとフロントエンドビューを設定できます。

ノート: npm install saves dependencies to the package.json file by default in current versions of Node. If you are running an older version of Node, you will have to add the --save flag to your npm install command to ensure that package.json gets updated.


アプリケーションのフロントエンドを作成する

まず、アプリケーションのパブリックビュー用のファイルを作成しましょう。 これは、ユーザーがフロントエンドに表示するものです。 index.htmlsuccess.html、およびerror.htmlを使用して、プロジェクトにpublicディレクトリを作成します。 これらの3つのファイルはすべて、bodyの内容が異なる、以下のHTMLスケルトンを持ちます。 各ファイルに次のコードを記述します。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>DigitalOcean Spaces Tutorial</title>

  <link rel="stylesheet" href="./style.css">
</head>

<body>

  <!-- contents will go here -->

</body>

</html>

error.htmlbodyにエラーメッセージを書き込んでください。

error.html

...

<h1>Something went wrong!</h1>
<p>File was not uploaded successfully.</p>

...

success.htmlbodyに成功メッセージを書き込んでください。

success.html

...

<h1>Success!</h1>
<p>File uploaded successfully.</p>

...

index.htmlでは、multipart/form-dataを使用してHTMLformを作成します。 シンプルなファイルアップロードinputと送信ボタンで構成されます。

index.html

...

<h1>DigitalOcean Spaces Tutorial</h1>

<p>Please select a file and submit the form to upload an asset to your DigitalOcean Space.</p>

<form method="post" enctype="multipart/form-data" action="/upload">
  <label for="file">Upload a file</label>
  <input type="file" name="upload">
  <input type="submit" class="button">
</form>

...

最後に、style.cssを作成し、アプリケーションを読みやすくするのに十分なCSSを追加しましょう。

style.css

html {
  font-family: sans-serif;
  line-height: 1.5;
  color: #333;
}

body {
  margin: 0 auto;
  max-width: 500px;
}

label,
input {
  display: block;
  margin: 5px 0;
}

これらの3つのファイルを使用して、小さなアプリケーションのメインページを構成するアップロードフォームがあり、ユーザーの成功ページとエラーページがあります。

ExpressServer環境をセットアップする

アプリケーションのフロントエンド用にすべてのファイルを作成しましたが、現在、サーバーをセットアップしたり、それらを表示する方法はありません。 ExpressWebフレームワークを使用してノードサーバーをセットアップします。

プロジェクトのルートディレクトリに、server.jsファイルを作成します。 上部に、require()を使用して4つの依存関係をロードします。 expressappインスタンスを介してアプリケーションをルーティングします。

server.js

// Load dependencies
const aws = require('aws-sdk');
const express = require('express');
const multer = require('multer');
const multerS3 = require('multer-s3');

const app = express();

フロントエンドはpublicディレクトリにあるため、その構成を依存関係の下に設定します。

server.js

...

// Views in public directory
app.use(express.static('public'));

サーバーのルートを基準にして、index.htmlsuccess.html、およびerror.htmlをルーティングします。

server.js

...

// Main, error and success views
app.get('/', function (request, response) {
  response.sendFile(__dirname + '/public/index.html');
});

app.get("/success", function (request, response) {
  response.sendFile(__dirname + '/public/success.html');
});

app.get("/error", function (request, response) {
  response.sendFile(__dirname + '/public/error.html');
});

最後に、リッスンするポートをサーバーに通知します。 この例では、3001が使用されていますが、使用可能な任意のポートに設定できます。

server.js

...

app.listen(3001, function () {
  console.log('Server listening on port 3001.');
});

server.jsを保存して、サーバーを起動します。 これを行うには、node server.jsを実行するか、package.jsonで設定したショートカットであるnpm startを使用します。

npm start
Output> node server.js

Server listening on port 3001.

http://localhost:3001に移動すると、index.htmlがサーバーのルートに設定されているため、アップロードフォームが表示されます。

http://localhost:3001/successおよびhttp://localhost:3001/errorに移動して、これらのページが正しくルーティングされていることを確認することもできます。

Multerを使用してスペースにファイルをアップロードする

サーバー環境が正常に稼働しているので、最後のステップは、フォームをMulterおよびMulter S3と統合して、Spacesにファイルをアップロードすることです。

new aws.S3()を使用してAmazonS3クライアントに接続できます。 DigitalOcean Spacesで使用するには、新しいエンドポイントを設定して、正しい場所にアップロードされるようにする必要があります。 執筆時点では、nyc3はスペースで使用できる唯一のリージョンです。

server.jsで、一番上までスクロールして戻り、定数宣言の下に次のコードを貼り付けます。

server.js

...
const app = express();

// Set S3 endpoint to DigitalOcean Spaces
const spacesEndpoint = new aws.Endpoint('nyc3.digitaloceanspaces.com');
const s3 = new aws.S3({
  endpoint: spacesEndpoint
});

multer-s3 ドキュメントの例を使用して、upload関数を作成し、bucketプロパティを一意のスペース名に設定します。 aclpublic-readに設定すると、ファイルに一般の人がアクセスできるようになります。 これを空白のままにすると、デフォルトでプライベートになり、Webからファイルにアクセスできなくなります。

server.js

...

// Change bucket property to your Space name
const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'your-space-here',
    acl: 'public-read',
    key: function (request, file, cb) {
      console.log(file);
      cb(null, file.originalname);
    }
  })
}).array('upload', 1);

upload機能が完了しました。最後のステップは、アップロードフォームをコードに接続してファイルを送信し、それに応じてユーザーをルーティングすることです。 server.jsの一番下までスクロールし、このコードをファイルの最後にあるapp.listen()メソッドのすぐ上に貼り付けます。

server.js

...
app.post('/upload', function (request, response, next) {
  upload(request, response, function (error) {
    if (error) {
      console.log(error);
      return response.redirect("/error");
    }
    console.log('File uploaded successfully.');
    response.redirect("/success");
  });
});

ユーザーが[送信]をクリックすると、POSTリクエストは/uploadに送られます。 ノードはこのPOSTをリッスンしており、upload()関数を呼び出します。 エラーが見つかった場合、条件ステートメントはユーザーを/errorページにリダイレクトします。 正常に通過すると、ユーザーは/successページにリダイレクトされ、ファイルがスペースにアップロードされます。

これがserver.jsのコード全体です。

server.js

// Load dependencies
const aws = require('aws-sdk');
const express = require('express');
const multer = require('multer');
const multerS3 = require('multer-s3');

const app = express();

// Set S3 endpoint to DigitalOcean Spaces
const spacesEndpoint = new aws.Endpoint('nyc3.digitaloceanspaces.com');
const s3 = new aws.S3({
  endpoint: spacesEndpoint
});

// Change bucket property to your Space name
const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'your-space-here',
    acl: 'public-read',
    key: function (request, file, cb) {
      console.log(file);
      cb(null, file.originalname);
    }
  })
}).array('upload', 1);

// Views in public directory
app.use(express.static('public'));

// Main, error and success views
app.get('/', function (request, response) {
  response.sendFile(__dirname + '/public/index.html');
});

app.get("/success", function (request, response) {
  response.sendFile(__dirname + '/public/success.html');
});

app.get("/error", function (request, response) {
  response.sendFile(__dirname + '/public/error.html');
});

app.post('/upload', function (request, response, next) {
  upload(request, response, function (error) {
    if (error) {
      console.log(error);
      return response.redirect("/error");
    }
    console.log('File uploaded successfully.');
    response.redirect("/success");
  });
});

app.listen(3001, function () {
  console.log('Server listening on port 3001.');
});

コマンドプロンプトでCONTROL+ Cと入力してノードサーバーを停止し、再起動して新しい変更が適用されていることを確認します。

npm start

プロジェクトのルートに移動し、ファイルを選択して、フォームを送信します。 すべてが適切に設定されている場合は、成功ページにリダイレクトされ、DigitalOceanSpaceで公開ファイルを利用できるようになります。

アップロードしたファイルがtest.txtであるとすると、ファイルのURLはhttps://your-space-here.nyc3.digitaloceanspaces.com/test.txtになります。

トランザクションが失敗する一般的な理由は、間違ったクレデンシャル、間違った場所にあるクレデンシャルファイル、または間違ったバケット名です。

結論

おめでとうございます。静的アセットをオブジェクトストレージにアップロードするようにNode.jsとExpressアプリケーションを設定しました。

ここでプロジェクトをリミックスすることで、このDigitalOceanSpacesNodeアプリのコードを試すことができます。

このタイプのアプリケーションを本番環境に移行するには、認証などの追加の予防措置を講じる必要がありますが、これは、WebアプリをDigitalOceanSpacesで機能させるための良い出発点です。 オブジェクトストレージの詳細については、DigitalOceanSpacesの概要を参照してください。