在Python AppEngine上从Android上传并读取该文件

时间:2011-12-11 21:44:22

标签: android python google-app-engine

我想从Android发送一个csv文件到Python AppEngine。我正在使用Blobstore API并发送文件,我使用MultipartEntityHttpPostHttpGet

因此,根据Blobstore API,您必须调用方法create_upload_url('/upload')来生成上传文件的网址,并使用此网址作为操作来上传文件。正如您可以阅读here

我在做什么?我调用一个创建此url的方法并将其返回到我的Android应用程序。使用此URL我上传文件。

生成的网址采用以下格式:

  

myapp.appspot.com/_ah/upload / 一批量-的号码和 - 字母/

基本上是这样的:

Android代码

 HttpClient httpClient = new DefaultHttpClient();
 HttpGet httpGet = new HttpGet(mContext.getString("myapp.appspot.com/get_blobstore_url");

 HttpResponse urlResponse = httpClient.execute(httpGet);

 result = EntityUtils.toString(urlResponse.getEntity());

 Uri fileUri = Uri.parse("file:///sdcard/dir/myfile.csv"); // Gets the Uri of the file in the sdcard
 File file = new File(new URI(fileUri.toString())); // Extracts the file from the Uri

 FileBody fileBody = new FileBody(file, "multipart/form-data");

 MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
 entity.addPart("file", fileBody);

 HttpPost httpPost = new HttpPost(result);

 httpPost.setEntity(entity);

 HttpResponse response = httpClient.execute(httpPost);
 response.getStatusLine();

AppEngine代码

# Returns only the URL in which the file will be uploaded, so this URL may be used in client for upload the file
class GetBlobstoreUrl(webapp.RequestHandler):
    def get(self):
        logging.info('here')
        upload_url = blobstore.create_upload_url('/upload')
        logging.info("url blob %s", upload_url)
        self.response.out.write(upload_url)

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        logging.info('inside upload handler')
        upload_files = self.get_uploads('file')
        blob_info = upload_files[0]
        return blob_info.key()

def main():
    application = webapp.WSGIApplication([('/upload', UploadHandler), ('/get_blobstore_url', GetBlobstoreUrl)], debug=True)
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

问题1

当我将文件发送到AppEngine返回的url时,这会自动调用服务器方法UploadHandler吗?因为没有显示此方法中的日志消息,并且正在插入文件,并且在使用生成的url上传文件时获得的响应是​​404错误,如果文件出现该错误的原因正在上传?

问题2

上传文件后,如何解析服务器中的csv文件并将文件中的所有数据插入数据存储区?

感谢。

1 个答案:

答案 0 :(得分:0)

  

当我将文件发送到AppEngine返回的url时,这将是   自动调用服务器方法UploadHandler?

正确。

  

当我将文件发送到AppEngine返回的url时,这将是   自动调用服务器方法UploadHandler?

向我们展示您的服务器日志 - 您获取404的网址是什么?你从上传处理程序那里得到任何日志消息吗?

  

上传文件后,如何解析服务器中的csv文件   并将文件中的所有数据插入数据存储区?

使用BlobReader API,并将打开的文件传递给python csv模块。