2013-01-24 28 views
1

我在我的Google App Engine應用程序中使用泰坦文件爲Data Store和Blob Store存儲提供類似文件系統的圖層。我有一個Google Apps腳本,用於向我的Google App Engine應用程序發送POST請求,以將數據存儲在Blob商店中。它在發送JSON數據(作爲字符串)時工作正常,但在發送二進制數據(如圖像)時不起作用。將圖片文件從Google Apps腳本發佈到使用泰坦文件的Google App Engine應用程序

我最終試圖將base64編碼數據作爲字符串發送並存儲在blob存儲中。我認爲我可以從blob存儲中檢索數據,base64將其解碼以獲取原始圖像。但是,它似乎並不奏效。

下面是我使用從谷歌Apps腳本發送數據的代碼:

function pushFileToFilePath(file, destinationFilePath) { 

var payload = 
    { 
     "content" : Utilities.base64Encode(file.getAs("image/jpeg").getBytes()) 
    }; 

    var options = 
    { 
     "method" : "post", 
     "payload" : payload 
    }; 

    var response = UrlFetchApp.fetch("https://myappname.appspot.com/_titan/file?path=" + destinationFilePath, options); 
    if (response.getResponseCode() == 201) 
    { 
    return true; 
    } 

    return false; 
} 

的數據是在團塊存儲中可用的請求被髮送後,其大小是符合我將期望從base64編碼文件的結果。不過,如果我使用谷歌應用程序引擎的儀表板和團塊存儲下載的文件使用

openssl -d -in base_64_encoded_file.txt -out image.jpg 

我得到一個零字節文件image.jpg的的base64解碼。

我也試過其他的方式來設置有效載荷對象。例如使用:

var payload = 
{ 
    "content" : file.getAs("image/jpeg").getBytes() 
}; 

給出對團塊存儲18個字節的文件,包含字符串「[Ljava.lang.Object」。 使用:

var payload = 
{ 
    "content" : file.getAs("image/jpeg") 
}; 

我得到下面的異常在我的谷歌應用程序引擎的日誌:

Bad request: 
Traceback (most recent call last): 
    File "/base/data/home/apps/s~myappname/live-1.364814133265166345/titan/files/handlers.py", line 103, in post 
    content, blob=blob, mime_type=mime_type, meta=meta, **method_kwargs) 
    File "/base/data/home/apps/s~myappname/live-1.364814133265166345/titan/files/files.py", line 408, in Write 
    content, blob = self._MaybeWriteToBlobstore(content, blob) 
    File "/base/data/home/apps/s~myappname/live-1.364814133265166345/titan/files/files.py", line 341, in _MaybeWriteToBlobstore 
    blob = utils.WriteToBlobstore(content, old_blobinfo=old_blobinfo) 
    File "/base/data/home/apps/s~myappname/live-1.364814133265166345/titan/common/utils.py", line 277, in WriteToBlobstore 
    content_file = cStringIO.StringIO(content) 
TypeError: expected read buffer, instance found 

我試着用BytesIO以流的內容,但我得到了其他異常。

你知道我如何將POST圖像(或更一般的二進制數據)發佈到泰坦文件嗎?

謝謝!

content = self.request.str_POST.get('content') 

這樣::

content = self.request.get('content') 

,並通過發送

UPDATE

我改變了 「內容」 數據從這個檢索的方式固定我的問題數據在我的Google Apps腳本中使用以下代碼:

var payload = 
{ 
    "content" : file.getAs("image/jpeg") 
}; 

即將「內容」設置爲Blob實例。

我不知道爲什麼我沒有嘗試這個在第一位:)無論如何,在泰坦文件的變化是一個破解,而不是一個永久的解決方案,所以我會嘗試拿出一個堅實它可以處理二進制和非二進制數據並將其提交給項目。

謝謝!

+0

沒關係(推薦)回答你自己的問題。 –

+0

我想要,但我必須等待8小時才能夠這樣做。現在完成了,謝謝。 – jgilli

回答

1

我在這裏創建了一個問題在泰坦文件的問題跟蹤器:http://code.google.com/p/titan-files/issues/detail?id=1。附加的補丁修復了這個問題,但它不是一個乾淨而強大的修復程序。 Titan Files的維護人員可能會很快更新該問題並提及適當的修補程序。

相關問題