Python 使用PhoneGap+;谷歌应用引擎上传和保存图片

Python 使用PhoneGap+;谷歌应用引擎上传和保存图片,python,google-app-engine,cordova,google-cloud-storage,Python,Google App Engine,Cordova,Google Cloud Storage,目标:在PhoneGap应用程序中拍摄/附加图片,并将每张图片的公共URL发送到Google Cloud SQL数据库 问题1:有没有办法从base64编码的图像(Python)创建一个Google云存储对象,然后将该对象上传到bucket并返回一个公共链接 我希望使用PhoneGap将图像发送到Python Google应用程序引擎应用程序,然后让该应用程序将图像发送到我设置的Google云存储桶,然后返回到PhoneGap应用程序的公共链接。这些图像可以直接从应用程序中拍摄,也可以从用户设备

目标:在PhoneGap应用程序中拍摄/附加图片,并将每张图片的公共URL发送到Google Cloud SQL数据库

问题1:有没有办法从base64编码的图像(Python)创建一个Google云存储对象,然后将该对象上传到bucket并返回一个公共链接

我希望使用PhoneGap将图像发送到Python Google应用程序引擎应用程序,然后让该应用程序将图像发送到我设置的Google云存储桶,然后返回到PhoneGap应用程序的公共链接。这些图像可以直接从应用程序中拍摄,也可以从用户设备上的现有照片中附加

我使用PhoneGap的FileTransfer插件将图像上传到GAE,这些图像作为base64编码图像发送(这不是我可以控制的)

根据我在谷歌文档中找到的内容,我可以将图片上传到Blobstore;但是,它需要表单中的
元素。我没有“文件”输入元素;我只需获取从PhoneGap的照相机对象返回的图像URI,并显示拍摄(或附加)的图片的缩略图

问题2:是否可以使用
元素并控制其值?如中所示,是否可以根据用户是选择文件还是拍照来设置其值


提前谢谢

是的,这是GAE和GCS的良好用途。您本身不需要
。您可以在对GAE url的调用中设置
POST
参数。请确保您还发送了一个隐藏密钥,并使用SSL安全URL,以防止垃圾邮件发送者向您的应用程序发送邮件。

这里为可能面临此问题的其他人提供了一个解决方案。事实证明这是难以置信的简单

一旦为GAE项目设置了bucket,就可以使用以下Python代码向bucket发送图像:

import cloudstorage as gcs
import webapp2
import cgi
import MySQLdb
import os
import logging
import time

from google.appengine.api import mail
from google.appengine.api import images
from google.appengine.ext import blobstore

class UploadImageHandler(webapp2.RequestHandler):
    def post(self):
        self.response.headers.add_header(ACCESS_CONTROL, '*')

        f = self.request.POST['image']
        fname = '/your-bucket-name/%s' % f.filename;

        gcs_file = gcs.open(fname, 'w', content_type="image/jpeg")
        gcs_file.write(self.request.get('image'))
        gcs_file.close()
以及用于从PhoneGap应用程序上载文件的代码:

// Uploads images in "imageURIs" to the web service specified in "server".
function uploadImages(imageURIs, server) {
    var success = function(data) {
        alert("Successfully uploaded image!");
    };

    var fail = function(error) {
        alert("Failed to upload image: "+error);
    };

    var options = new FileUploadOptions();
    options.fileKey = "image";
    options.mimeType = "image/jpeg";
    var ft = new FileTransfer();

    for (var i = 0; i < imageURIs.length; i++) {
        alert("Uploading"+i);
        options.fileName = imageURIs[i].substr(imageURIs[i].lastIndexOf('/') + 1);
        ft.upload(imageURIs[i], encodeURI(server), success, fail, options);
    }
}
//将“ImageURI”中的图像上载到“服务器”中指定的web服务。
函数上载映像(ImageURI、服务器){
var success=函数(数据){
警报(“已成功上载图像!”);
};
var fail=功能(错误){
警报(“未能上载图像:+错误”);
};
var options=new FileUploadOptions();
options.fileKey=“image”;
options.mimeType=“image/jpeg”;
var ft=新文件传输();
对于(var i=0;i

我希望它能帮助其他人。:)

PhoneGap中的FileTransfer()插件实际上上传了一个文件(不是base64字符串),所以我的GAE应用程序中有这个文件;我只是想把它送到地面军事系统。隐藏密钥和SSL安全URL的想法对我来说是陌生的,所以我将对此进行研究。我的下一个问题是,如果我创建了一个CGS对象,我可以将self.request.POST['image'].文件内容写入其中吗?已经有一段时间了,但仍然很有帮助!!