2017-01-26 30 views
0

我試圖將遠程圖像文件保存到數據庫中,但由於以前從未做過,所以我遇到了一些問題。使用node/request/sequelize/mysql將圖像文件保存到數據庫中

我需要下載圖像並將其與一些其他屬性一起傳遞給另一個節點api(使用sequelize將其保存到mysql數據庫中)。我已經設法獲得一些數據來保存,但是當我手動下載並嘗試打開它時,它不是真正可用,也沒有圖像顯示。

我已經嘗試了一些事情:獲取與節點請求的圖像,將其轉換爲base64字符串(閱讀有關的地方),並傳遞它在JSON有效載荷,但沒有奏效。試圖發送它作爲一個多部分,但也沒有工作。還沒有在stream/buffers/multipart中使用過,而且從來沒有在node中使用過。我試過查看節點請求管道,但我無法弄清楚可能如何將它們應用於此上下文。

這裏是我現在有(這是一個部分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

這不是對您的問題的直接回答,但很少需要將圖像實際存儲在數據庫中。通常所做的是將圖像存儲在像S3這樣的存儲設備上,像CloudFront這樣的CDN,或者甚至在靜態文件服務器的文件系統中存儲圖像,然後僅在實際數據庫中存儲圖像的文件名或ID。

如果您有機會將這些圖像提供給某些客戶,那麼從數據庫而不是CDN或文件系統提供這些圖像將非常低效。如果你不打算提供這些圖像,那麼實際上將它們放入數據庫中仍然沒有什麼理由。這不像您要查詢數據庫中特定的圖像內容,或是對您使用的圖像格式的特定序列化結果排序。

您可以做的最簡單的事情就是用唯一的文件名(隨機字符串,UUID或數據庫中的密鑰)保存圖像,並使用您需要的其他數據將ID或文件名保存在數據庫中。如果您需要有效地提供服務,請考慮使用S3或某些CDN。

相關問題