2011-06-19 2 views
1

ユーザがローカルファイルシステムからイメージを選択し、このイメージをページ上のキャンバス要素にレンダリングできるようにします。Node.jsでアップロードされたマルチパート/フォームデータをbase64形式に変換する方法

セキュリティ上の制約( 'サンドボックス'ブラウザセキュリティモデル)のため、クライアントのjavascriptはファイルシステム上のイメージに直接アクセスできないため、サーバーへの往復を 'multipart/form-data'としてファイルアップロードコントロール。

私はこのイメージをサーバーに実際に保存しておきたいと思いません。これは、クライアント側の操作を一度しか行わないためです。だから、画像データのサーバー側を、クライアントに送り返すことができるbase64でエンコードされた表現に変換することが可能かどうか疑問に思っていました。それで、サーバー上のどこにでもイメージを保存することなく、簡単にデータURLとしてクライアントに戻すことができました。それとも良い方法がありますか?

私はサーバー上でnode.jsを使用しています。

答えて

1

サーバーに保存する必要はありませんか、またはBase64 encoding a data URIのコストがかかります。クライアントがダウンロードできるだけの長さのメモリにそれを保存してください。したがって、あなたのシーケンスは次のようになります:

  1. クライアントは「multipart/form-data」送信を介して画像をアップロードします。
  2. サーバーがフォームを受信すると、サーバーは「スローアウェイ」URLを生成します(たとえば、#1の要求の応答本文として返される可能性があります)。画像ファイルデータは単にメモリに記憶される。
  3. クライアントは、#2のURLからイメージデータを取得できます。
  4. クライアントが#2でURLを要求すると、サーバーは単に画像データをエコーし​​ます。要求が完了すると、サーバはデータ参照を破棄して、メモリを解放することができる。

node.jsとAJAXの両方のリクエストが非同期であるため、項目1-4は同時に実行できます(ただし、スローアウェイURLはフォームの投稿とは別に合意する必要があります)。それは本当にそのように働く)。

1

https://github.com/joyent/node/wiki/modulesに行くbase64エンコードライブラリを取得し、単に適切な(GIF/JPEG)であるものは何でもして「PNG」を置き換える、data:image/png;base64,がBase64でエンコードされたファイルが続いてエコー

「より良い」方法があります実際にファイルをtmpフォルダーにドロップするには、そのファイルへのリンクをエコーし​​、そのディレクトリー内のX分より古いファイルをすべて削除します。

関連する問題