将文件从Javascript上传到Google Cloud Endpoint

我正在使用HTML5 + Javascript + jQueryMobile创建一个Web应用程序,我想使用我创建的Google Cloud Endpoint将文件上传到Google App Engine Web应用程序。

当我控制双方时,我可以(并且希望)创建最简单的交互。

至于端点,我想到了创建这样的方法:

@ApiMethod( name = "uploadFile", path = "upload_file", httpMethod = HttpMethod.POST ) public void uploadFile(File file) { //process the file } 

这个File类可以包含一个类型为Blob的字段fileData ,或者byte []或者类似的东西,重新显示文件数据…类似于:

 public class File { private String fileName; private long fileSize; private Blob fileData; //getters and setters } 

所以第一个问题是: 这个字段 fileData 最合适的类型是 什么?

并且,考虑到为该字段选择的类型, 我如何为Javascript / jQuery的端点方法创建必要的POST请求?

基本上我需要创建一个POST请求到http://myappid.appspot.com/_ah/api/files/v1/upload_file ,在POST数据中添加File对象。

注意:对不起,我没有为Javascript代码做过任何尝试,因为我对这些技术一点都不熟悉,所以我很感激任何帮助……

编辑:下面的答案瞄准AppEngine的python版本

这是一个普遍的需求,没有明确的解决方案。 到目前为止, gae-init-upload演示了如何使用AppEngine和CoffeeScript实现这一目标。 值得一看,CoffeeScript正在编译成JavaScript,以防您不熟悉。

您正在寻找的JavaScript解决方案

/main/static/src/coffee/common/upload.coffee

我最终在我的AMD Javascript应用程序中使用了这段代码。 对不起,我不能解释得太多,因为自从我编写这个项目以来,我写了大量的代码,你可以看到我没有正确评论代码( 失败!! ),无论如何也许你可以得到一些想法……

请注意,有一些关于获取导航器位置的信息,因为我想存储文件上传的位置,但根本不需要!

Controller.js

  uploadFile: function(request, render) { var self = this; var file = $("#file").get(0).files[0]; var reader = new FileReader(); reader.onload = function (evt) { var upload = { provider: self.folder.provider, folderIdentifier: self.folder.id, fileName: file.name, fileSize: file.size, base64Data: btoa(evt.target.result), location: { latitude: self.position.coords.latitude, longitude: self.position.coords.longitude } } var uploadFilePromise = self.connector.uploadFile(self.sessionToken.token, upload); uploadFilePromise.done(function (file) { render("file", { result: "DONE", file: file }); }); uploadFilePromise.fail(function (error) { render("file", { result: "FAIL" }); }); } navigator.geolocation.getCurrentPosition(function(position) { self.position = position; reader.readAsBinaryString(file); }); } 

Connector.js

  uploadFile: function (sessionToken, upload) { var self = this; var promise = new Promise(); gapi.client.load('upload', 'v1', function() { var request = gapi.client.upload.uploadFile({ session_token: sessionToken, resource: upload }); request.execute(function(response) { if (response.error) { promise.reject(response.error); } else { var file = File.create(response.result.provider, response.result.type, response.result.identifier, response.result.name, response.result.description, response.result.created, response.result.size, response.result.link, { latitude: response.result.location.latitude, longitude: response.result.location.longitude }); promise.resolve(file); } }); }, self.api); return promise; } 

Endpoint.java

 @Api(name="upload") public class UploadEndpoint { @ApiMethod( name = "uploadFile", path = "upload_file", httpMethod = HttpMethod.POST ) public File uploadFile ( @Named("session_token") String token, Upload upload) throws InternalServerErrorException { File file = new UploadController().uploadFile(token, upload); return file; } }