如何从本地运行的应用程序访问云存储文件

时间:2012-03-17 18:29:06

标签: server-error google-cloud-storage

我已成功将文件写入Google云存储并阅读。我将应用程序部署到appspot后,一切都很好,但在本地运行时出现错误:

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云端存储文件?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

我能够找到并使用上面提到的模拟服务。不幸的是,对于这个帖子,我不懂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

答案 2 :(得分:-1)

要在本地运行它“伪”(比如在命令行上),首先应该部署它,然后使用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,而不是多次提交表单