6

我正在创建一个仅使用HTML5 + Javascript + jQueryMobile的网络应用程序,并且我想使用同样由我创建的Google Cloud Endpoint将文件上传到Google App Engine网络应用程序。

当我控制双方时,我可以(并且想要)创建尽可能简单的交互。

至于端点,我想创建一个这样的方法:

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

此类File可以包含fileDataBlob 类型的字段,或 byte[] 或类似的字段,代表文件数据......类似于:

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

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

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

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

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

4

2 回答 2

1

编辑:下面的答案针对 AppEngine 的 python 版本

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

您正在寻找的 JavaScript 解决方案位于

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

于 2013-04-09T11:09:41.827 回答
1

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

请注意,获取导航器位置有些问题,因为我想存储文件上传的位置,但根本没有必要!

控制器.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);
        });
    }

连接器.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;
    }

端点.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;
    }

}
于 2014-03-13T22:23:39.303 回答