我在我的Google App Engine应用程序中使用titan-files为Data Store和Blob Store存储提供类似文件系统的层。我有一个Google Apps脚本,可以将POST请求发送到我的Google App Engine应用程序,以将数据存储在Blob商店中。它在发送JSON数据(作为字符串)时工作正常,但在发送二进制数据时不起作用,如图像。
我最终尝试将base64编码数据作为字符串发送并将其存储在blob存储区中。我以为我可以从blob存储中检索数据并对其进行解码以获取原始图像。但是,它似乎不起作用。
以下是我用于从Google 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;
}
发送请求后,数据在blob存储区中可用,其大小与我对base64编码文件的结果的预期一致。但是,如果我使用Google App Engine仪表板从blob商店下载文件并使用
进行base64解码openssl -d -in base_64_encoded_file.txt -out image.jpg
我得到一个零字节的image.jpg文件。
我还尝试了其他方法来设置有效负载对象。例如使用:
var payload =
{
"content" : file.getAs("image/jpeg").getBytes()
};
在blob存储上给出一个18字节的文件,其中包含字符串“[Ljava.lang.Object”。 使用:
var payload =
{
"content" : file.getAs("image/jpeg")
};
我的Google App Engine日志中出现以下异常:
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来传输内容,但我还有其他例外。
您是否知道如何将图像(或更常见的二进制数据)发布到titan文件?
谢谢!
更新
我通过更改从此处检索“内容”数据的方式来解决我的问题:
content = self.request.str_POST.get('content')
到此:
content = self.request.get('content')
并使用我的Google Apps脚本中的以下代码发送数据:
var payload =
{
"content" : file.getAs("image/jpeg")
};
即将“content”设置为Blob实例。
我不知道为什么我不首先尝试这个:)无论如何,titan文件的变化是一个黑客而不是永久的解决方案,所以我会试着想出一个坚实的补丁处理二进制和非二进制数据并将其提交给项目。
谢谢!
答案 0 :(得分:1)
我在titan-files的问题跟踪器中创建了一个问题:http://code.google.com/p/titan-files/issues/detail?id=1。附加到它的补丁修复了这个问题,但它不是一个干净而强大的修复程序。 Titan Files的维护者可能很快会更新问题,并提及正确的解决方案。