2016-03-03 104 views
2

之前,我詢問了關於使用Blobstire API上傳可恢復上傳的問題https://stackoverflow.com/questions/35581090/can-i-use-resumable-upload-for-gae-blobstore-api 。 對於我自己,我決定用Blobstire API實現可恢復的上傳是不可能的。 在這種情況下,我試圖通過Java客戶端庫實現Google Cloud Storage。目前,我已經下載了我的視頻文件來存儲視頻。我的servlet看起來像在谷歌例如用於Google雲端存儲的客戶端庫的可恢復上傳

@Override 
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
    GcsOutputChannel outputChannel = 
     gcsService.createOrReplace(getFileName(req), GcsFileOptions.getDefaultInstance()); 
    copy(req.getInputStream(), Channels.newOutputStream(outputChannel)); 
    } 

    private GcsFilename getFileName(HttpServletRequest req) { 
    String[] splits = req.getRequestURI().split("/", 4); 
    if (!splits[0].equals("") || !splits[1].equals("gcs")) { 
     throw new IllegalArgumentException("The URL is not formed as expected. " + 
      "Expecting /gcs/<bucket>/<object>"); 
    } 
    return new GcsFilename(splits[2], splits[3]); 
    } 

    private void copy(InputStream input, OutputStream output) throws IOException { 
    try { 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     int bytesRead = input.read(buffer); 
     while (bytesRead != -1) { 
     output.write(buffer, 0, bytesRead); 
     bytesRead = input.read(buffer); 
     } 
    } finally { 
     input.close(); 
     output.close(); 
    } 
    } 

現在我需要實現

  • 繼續上傳(由於移動設備上的互聯網不良)
  • 上傳的chunck(由於限制在一個尺寸請求與32mb)

我意識到,可恢復的上傳serverside應該手動組織,我的後端應該能夠給我範圍上傳的chunck和a繼續引導至OutputChannel。

爲GcsOutputChannel文檔說:

這個類是可序列化的,這允許部分寫入的文件, 序列化GcsOutputChannel反序列化它,並繼續 寫入到同一個文件。對於這一個序列化實例是 有效的時間是有限的,由谷歌雲存儲服務

我沒有足夠的經驗來確定,因此,問題可能是愚蠢的: 請有人告訴我如何序列我GcsOutputChannel?我不明白我可以在哪裏保存包含序列化對象的文件。

順便說一句,任何人都可以知道Google Cloud Storage服務存儲該序列化對象多長時間嗎?

回答

1

您可以使用任何Java序列化方法(通常使用ObjectOutputStream)來序列化您的GcsOutputChannel。如果您在AE上運行,則可能需要將該序列化的字節保存到數據存儲區(作爲數據存儲區Blob)。請參閱link以瞭解如何將字符串數組轉換爲字節數組。

+0

是的,你理解正確,我跑在GAE。我想在Cloud Storage中使用Blobstore API或者甚至將序列化對象保持原樣。 **但這不是過分嗎?**我的意思是,Google API沒有特殊的機制來存儲序列化的GcsOutputChannel。它被寫入碼頭:_「序列化實例的有效時間受到Google雲端存儲服務的限制和決定」_。無論如何,非常感謝你,你已經確信存儲在存儲器中的序列化對象也是可能的解決方案 –

+0

不,沒有一種專門的方式來存儲GcsOutputChannel,但有一種方法可以使它**可存儲**,所以你可以存儲它(基本上是GCS可恢復寫入的句柄以及無法寫入的任何內容[因爲GCS要求最後一個256 KB的最小塊]]任何你想要的地方。如前所述,數據存儲的共同點就是數據存儲。我忘了提及這個句柄有效期爲一週(由服務強制執行)。 – ozarov

+0

好,你好。最後一條關於這個問題的問題。我是否正確理解序列化對象會比我寫入的字節數多一些(因爲序列化算法)? –

相關問題