【问题标题】:How to access Cloud Storage file from App running at local如何从本地运行的应用程序访问云存储文件
【发布时间】:2012-03-17 18:29:06
【问题描述】:

我刚刚成功将文件写入谷歌云存储并读取它。将应用部署到 apppot 后一切正常,但在本地运行时出现错误:

INTERNAL_SERVER_ERROR
    Caused by:java.io.IOException
        at com.google.appengine.api.files.FileServiceImpl.translateException(FileServiceImpl.java:586)
        at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:561)
    ......

你们中有人知道如何从 localhost 访问 Google Cloud Storage 文件吗?

【问题讨论】:

    标签: server-error google-cloud-storage


    【解决方案1】:

    App Engine 开发人员测试环境支持 Google Cloud Storage 的本地模拟,但不提供对真实事物的 RPC 访问。因此,您的代码应该在这两种环境中都可以工作,但您应该将这两种模式视为具有不同的名称空间和内容。因此,例如,如果您的代码希望看到包含对象 bar 的特定存储桶 foo,则您需要单独创建该存储桶/对象并确保它包含合理的内容,以便本地开发人员模式按预期工作。

    【讨论】:

      【解决方案2】:

      我能够找到并使用上面提到的模拟服务。不幸的是,对于这个线程,我不知道 Java。但它在Python中的用法如下...

      $ python2.7 google_appengine/google/appengine/tools/api_server.py --application myapp
      

      (请注意,api_server.py 需要 Python 2.7,因为它依赖于 argparse 模块。)

      其他人将不得不弄清楚如何在 Java 中做同样的事情。对不起。 :(

      编辑: api_server.py 位于基本目录中:

      $ python2.7 google_appengine/api_server.py
      

      【讨论】:

        【解决方案3】:

        要在本地“伪”运行它(例如在命令行上),您应该首先部署它,然后使用 HttpClient 连接到您的服务器。这样您就可以从命令行与您的 servlet/jsp 进行交互,而不必提交带有文件附件的表单

        示例代码 [你当然可以得到更多的创意]

        import java.io.ByteArrayOutputStream;
        import java.io.File;
        import java.io.IOException;
        
        import org.apache.http.HttpResponse;
        import org.apache.http.client.HttpClient;
        import org.apache.http.client.methods.HttpPost;
        import org.apache.http.client.methods.HttpUriRequest;
        import org.apache.http.entity.mime.MultipartEntity;
        import org.apache.http.entity.mime.content.FileBody;
        import org.apache.http.impl.client.DefaultHttpClient;
        import org.apache.http.client.ClientProtocolException;
        
        
        public class FileUploaderClient {
        
            /**
             * @param args
             */
            public static void main(String[] args) throws ClientProtocolException, IOException{
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://<app-version>.<app-name>.appspot.com/<servlet-name>");
                MultipartEntity reqEntity = new MultipartEntity();
                FileBody bin = new FileBody(new File("<File you want to upload>"));
                reqEntity.addPart("file", bin);
                httppost.setEntity(reqEntity);
                HttpResponse response = httpclient.execute(httppost);
                System.out.println(response.getStatusLine());
        
            }
        
        }
        

        现在您可以循环调用您的 servlet,而不是多次提交表单

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-04
          • 2014-12-06
          • 2014-01-11
          • 2013-02-01
          • 2011-08-09
          • 2023-01-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多