Node.jsを使用してファイルをオブジェクトストレージにアップロードする方法
序章
オブジェクトストレージは、オーディオ、画像、テキスト、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.jsのAWS 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_key
とyour_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.html
、success.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.html
のbody
にエラーメッセージを書き込んでください。
error.html
... <h1>Something went wrong!</h1> <p>File was not uploaded successfully.</p> ...
success.html
のbody
に成功メッセージを書き込んでください。
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つの依存関係をロードします。 express
のapp
インスタンスを介してアプリケーションをルーティングします。
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.html
、success.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
プロパティを一意のスペース名に設定します。 acl
をpublic-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の概要を参照してください。