Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将文件从Javascript上载到Google云端点_Javascript_Jquery_Google App Engine_Google Cloud Endpoints - Fatal编程技术网

将文件从Javascript上载到Google云端点

将文件从Javascript上载到Google云端点,javascript,jquery,google-app-engine,google-cloud-endpoints,Javascript,Jquery,Google App Engine,Google Cloud Endpoints,我正在创建一个web应用程序,只使用HTML5+Javascript+jQueryMobile,我想使用我创建的谷歌云端点将一个文件上传到谷歌应用程序引擎web应用程序 当我控制双方时,我可以(并且希望)创建尽可能最简单的交互 至于端点,我想创建一个如下的方法: @ApiMethod( name = "uploadFile", path = "upload_file", httpMethod = HttpMethod.POST ) public void uploadFile(Fil

我正在创建一个web应用程序,只使用HTML5+Javascript+jQueryMobile,我想使用我创建的谷歌云端点将一个文件上传到谷歌应用程序引擎web应用程序

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

至于端点,我想创建一个如下的方法:

@ApiMethod(
  name = "uploadFile",
  path = "upload_file",
  httpMethod = HttpMethod.POST
)
public void uploadFile(File file) {
  //process the file
}
这个
文件
类可以包含Blob类型的字段
文件数据
,或者byte[]之类的内容,用于重新设置文件数据。。。比如:

public class File {    
  private String fileName;
  private long fileSize;
  private Blob fileData;    
  //getters and setters
}
因此,第一个问题是:这个字段最合适的类型是什么

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

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


注意:很抱歉,我没有尝试Javascript代码,因为我对这些技术一点也不熟悉,所以我非常感谢您的帮助……

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

这是一个没有明确解决办法的共同要求。到目前为止,这是一个演示如何通过AppEngine和CoffeeScript实现这一目标的演示。值得一看的是,CoffeeScript正在被编译成JavaScript,以防您不熟悉

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


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

请注意,获取导航器位置是有原因的,因为我想存储文件上载的位置,但这根本不是必需的

Controller.js Connector.js Endpoint.java
对不起,我给蟒蛇写了一个答案。我想看看这个问题的答案。我正在使用dart端点(但与javascript端点客户端api的概念相同),为了上传文件,我必须使用webapp2处理程序,而不是端点服务。这很糟糕,因为endpoints.get_current_user()在使用webapp2处理程序时为null,所以我必须解决这个问题。@robertking,我刚刚用我使用的代码添加了一个答案,也许你可以找到一些有趣的东西,尽管我不记得了,所以无法解释太多:)谢谢@MikO。btoa(base64)是一个选项,但有些文件可能太大。@robertking,是的,当然!这是我MSc项目的一小部分,我得到了很好的分数,但它有很多缺点:)这不是很有帮助。将文件上传到普通的GAE web应用程序非常容易。困难的部分是如何通过谷歌云端点实现。你有到UploadController源的链接吗?对UploadController操作或其源有什么建议吗
    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);
        });
    }
    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;
    }
@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;
    }

}