如何使用Google Cloud Endpoints返回文件?

时间:2016-06-01 22:24:33

标签: java google-app-engine google-cloud-endpoints google-cloud-platform

我有一个生成带有一些db记录的CSV文件的方法

    public static void generateCsvForAttendees( List<Attendee> attendeeList ) throws FileNotFoundException
    {
        PrintWriter pw = new PrintWriter(new File("test.csv"));

        StringBuilder sb = new StringBuilder();

        //Header
        sb.append( "Id" );
        sb.append( ',' );
        sb.append( "Name" );
        sb.append( ',' );
        sb.append( "Lastname" );
        sb.append('\n');

        //Content
        for( Attendee attendee: attendeeList )
        {
            sb.append( attendee.getId() );
            sb.append( ',' );
            sb.append( attendee.getUser().getName() );
            sb.append( ',' );
            sb.append( attendee.getUser().getLastname() );
            sb.append( '\n' );

        }

        pw.write(sb.toString());
        pw.close();
    }

我希望该方法可以是一个端点,以便从任何类型的客户端(Web或移动设备)调用它来下载它。在Google Cloud Endpoint documentation中,没有关于File作为有效返回类型的内容。我如何创建和返回文件的端点?

2 个答案:

答案 0 :(得分:4)

以下是如何将文件从端点保存到云存储并返回用于下载的URL。

1 /在项目控制台中激活Google云端存储

2 /在您的云存储实例中创建一个名为bucketName的存储桶。可选:您可以在此存储桶上设置访问权限。

3 /在您的端点类中,创建一个gcsService作为folllow:

private final GcsService gcsService = GcsServiceFactory.createGcsService(new RetryParams.Builder()
        .initialRetryDelayMillis(10)
        .retryMaxAttempts(10)
        .totalRetryPeriodMillis(15000)
        .build());

4 /在您的方法中,创建一个ByteArrayOutputStream:

ByteArrayOutputStream os = new ByteArrayOutputStream();

5 /从ByteArrayOutputStream

创建您的打印机

6 /然后执行以下操作:

ByteBuffer buf = ByteBuffer.wrap(os.toByteArray());
GcsFilename gcsfileName = new GcsFilename(bucketName, bucketFileName);
//bucketFileName =  your file name
GcsFileOptions options = new GcsFileOptions.Builder().mimeType("text/plain").build();
GcsOutputChannel outputChannel = gcsService.createOrReplace(gcsfileName, options);
outputChannel.write(buf);
outputChannel.close();

7 /然后您的文件应保存到云存储:您只需在字符串包装器中返回要打开它的URL。查看以下文档以确定要使用的URL(取决于是否应对用户进行身份验证,请参阅部分&#34;授予用户对对象的读取权限&#34;)https://cloud.google.com/storage/docs/cloud-console#_accessing

答案 1 :(得分:0)

CSV文件很容易在客户端中使用 - 毕竟,它们都是带有逗号和引号的特殊格式的字符串,而不是。你可以做的只是在你的端点方法中返回一个字符串 - 整个字符串就是你的CSV文件。然后在客户端中,您知道String是CSV,因此请相应地处理它(即将其写入文件并使用.csv扩展名保存)。

Cloud Endpoints实际上只返回一个JSON字符串。您也可以尝试Base64编码File to String,然后解码客户端中的Base64字符串,但在我看来,从CSV文件开始我可能更容易做。您从GAE获得的响应也有1MB的限制。在此处阅读更多相关信息:Query response size limit on appengine?