2015-08-21 40 views
2

我正在使用Scala Play2框架,並試圖將SVG字符串數據轉換爲其他文件類型,如PDF,PNG,JPEG,並將其作爲文件發送給客戶端。如何實現Play2 API服務器通過Ajax返回文件?

我想實現的是

  1. 客戶端通過Ajax發送數據(POST與真正巨大的JSON)
  2. 服務器從JSON
  3. 服務器返回的文件給客戶端生成一個文件。

但似乎幾乎不可能發送文件並讓客戶端將其保存爲靜態文件,所以我打算在客戶端請求上創建新的靜態文件並將其訪問網址返回給客戶端並將其打開通過Javascript。之後客戶完成下載,刪除文件在服務器雖然,在這個方法中,我不得不

def generateFile = { 
... 
... 
outputStream.flush() // save the file to a disk 
} 

Ok.sendFile(new File("foo.pdf")) 

我需要寫入和讀取文件的存儲磁盤。我不認爲這是一種有效的方式。

有沒有更好的方法來實現我想要的?

預先感謝您。

+0

那麼,我理解正確嗎? 1)您想通過AJAX將JSON發送到您的Play服務器。 2)播放,然後從JSON數據中生成一個文件,並將其存儲在公共資產文件夾的某處。 3)播放將此生成的文件的URL返回給客戶端。 4)然後客戶端可以通過GET下載帶有URL的文件。 5)播放完成後刪除文件。正確? – Kris

+0

@Kris幾乎正如你所提到的,但有一點,我不認爲存儲JSON文件,但生成文件本身。 – suish

+0

但是,如果我們在這裏討論不同的請求,那麼你必須將文件存儲在某處(例如文件系統)。首先,AJAX請求生成文件,第二個讓您下載該文件。由於你的服務器是無狀態的,你必須將文件存儲在某個地方。 – Kris

回答

0

爲什麼你認爲這不夠有效?

我見過的一個項目了類似的方法:

  • 圖像轉換和使用一個特殊的命名方案
  • 專用服務器資源流的圖像到客戶端存儲在任意tmp目錄
  • 系統每5分鐘觸發一次cronjob,刪除tmp目錄下大於5分鐘的圖像

區別在於圖像數據e SVG字符串)不是由客戶端發送的,而是存儲在數據庫中的。

如果您的轉換庫能夠在內存中生成圖像,也許您可​​以跳過將圖像寫入磁盤的步驟。