2017-01-26 2 views
0

リモートイメージファイルをデータベースに保存しようとしていますが、これまでに行ったことがないのでいくつか問題があります。node/request/sequelize/mysqlを使ってイメージファイルをデータベースに保存します。

私は画像をダウンロードして、他のいくつかのプロパティを持つ(node-requestとともに)別のノードapiに渡して、mysqlデータベースに保存します(sequelizeを使用してください)。私はいくつかのデータを保存することができましたが、手動でダウンロードして開こうとすると、実際には使用できず、画像も表示されません。

node-requestでイメージを取得し、base64文字列に変換して(どこかで読んで)jsonペイロードに渡していましたが、うまくいきませんでした。マルチパートとして送信しようとしましたが、どちらもうまくいきませんでした。ストリーム/バッファ/マルチパートでは、これまでにノードでずっと以前とは全く関係がありませんでした。私はノード要求のパイプを調べてみましたが、実際にどのようにこのコンテキストに適用するかを理解できませんでした。ここで

は、私は現在、(NO「関数」キーワードはありませんので、それは一部のES6クラスです;また、要求がpromisifiedされる)持っているものです。

function getImageData(imageUrl) { 
    return request({ 
     url: imageUrl, 
     encoding: null, 
     json: false 
    }); 
} 

function createEntry(entry) { 
    return getImageData(entry.image) 
     .then((imageData) => { 
      entry.image_src = imageData.toString('base64'); 
      var requestObject = { 
       url: 'http://localhost:3000/api/entry', 
       method: 'post', 
       json: false, 
       formData: entry 
      }; 
      return request(requestObject); 
     }); 
} 

私はほぼ100%確信している問題は、この部分にありますapiはそれが得たものだけを取り、それを後のテーブルに入れるためにそれを与えるので、私は間違っている可能性があります。画像フィールドはlongblobとして設定されます。

私は一度それを理解すると簡単だと確信していますが、これまでのところ私は困惑しています。

答えて

2

これはあなたの質問に対する直接の回答ではありませんが、実際にデータベースに画像を保存する必要はほとんどありません。通常は、CloudFrontのようなS3や静的ファイルサーバのファイルシステムのようなS3のようなストレージに画像を保存し、実際のデータベースに画像のファイル名やIDだけを保存することです。

これらのイメージを一部のクライアントに提供する可能性がある場合は、CDNまたはファイルシステムではなくデータベースから提供することは非常に非効率的です。あなたがそれらのイメージを提供するつもりがないなら、データベースに実際に置く理由はほとんどありません。イメージの特定の内容をデータベースに照会したり、使用するイメージ形式の特定のシリアル化の結果をソートするようなことはありません。

最も簡単なことは、一意のファイル名(ランダムな文字列、UUIDまたはデータベースのキー)で画像を保存し、IDやファイル名を必要な他のデータでデータベースに保存することです。効率的に提供する必要がある場合は、S3またはそれに対応するCDNを使用することを検討してください。

関連する問題