【问题标题】:Impossible to download a file in CSV format无法下载 CSV 格式的文件
【发布时间】:2016-01-31 14:56:55
【问题描述】:

我在使用 Google Drive API 时遇到了一些麻烦。 我正在尝试使用 Java 应用从我自己的 Google Drive 下载电子表格。

根据 Google 的文档 (https://developers.google.com/drive/v3/web/manage-downloads) 可以使用“text/csv”参数以 CSV 格式下载电子表格。我的问题是,当我尝试以 CSV 格式下载我的文件时,我遇到了一个错误,但它以其他格式工作。

我得到的错误是:

Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 500 Internal Server Error
{
  "code" : 500,
  "errors" : [ {
    "domain" : "global",
    "message" : "Internal Error",
    "reason" : "internalError"
  } ],
  "message" : "Internal Error"
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeAndDownloadTo(AbstractGoogleClientRequest.java:541)

我的代码如下:

public static Drive getDriveService() throws IOException
        {
            Credential credential = authorize();
            return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();
        }

    public static void main(String[] args) throws IOException
        {
            // Build a new authorized API client service.
            Drive service = getDriveService();

            // Print the names and IDs for up to 10 files.
            FileList result = service.files().list().setPageSize(10).setFields("nextPageToken, files(id, name)").execute();
            List<File> files = result.getFiles();
            if (files == null || files.size() == 0)
                {
                    System.out.println("No files found.");
                }
            else
                {
                    for (File file : files)
                        {
                            if (file.getName().equals(Settings.DRIVE_FILE_NAME))
                                {
                                    System.out.printf("%s (%s)\n", file.getName(), file.getId());
                                    String fileId = file.getId();
                                    OutputStream outputStream = new ByteArrayOutputStream();
                                    service.files().export(fileId, "text/csv").executeAndDownloadTo(outputStream);
                                    System.out.println(outputStream);

                                }

                        }
                }
        }

我哪里做错了?

谢谢!

【问题讨论】:

  • 尝试使用方法 executeMediaAndDownloadTo() 而不是 executeAndDownloadTo()
  • 这是服务器端错误。您需要查看服务器日志以了解问题所在。

标签: java csv google-drive-api


【解决方案1】:

根据 Google 官方文档,当您收到“500: Backend Error”时,表示处理请求时发生了意外错误。

为此建议的操作是使用“指数退避”。 指数退避是网络应用程序的标准错误处理策略,其中客户端在越来越长的时间内定期重试失败的请求。如果大量请求或繁重的网络流量导致服务器返回错误,指数退避可能是处理这些错误的好策略。

指数退避提高带宽使用效率,减少获得成功响应所需的请求数量。

更多详情,请点击链接:https://developers.google.com/drive/v3/web/handle-errors#500_backend_error强调文字

【讨论】:

  • 这是 Google 建议的操作,还是您的操作?服务器错误是服务器错误。没有理由相信重复请求不会产生同样的错误。它需要在服务器端进行调查修复而不仅仅是在运行时盲目地重复。
  • Drive REST API 的 Google 文档中指出,如果遇到“500:Backend Error”,建议的操作是使用“exponential backoff”。这是我得到答案的地方:developers.google.com/drive/v3/web/…
  • 500 个错误是 50:50 有时它们是暂时的,随后会在回退后成功(尽管可能需要很多回退,所以最好直接失败)。其他时候,您的请求中存在 Google 云端硬盘未正确处理的问题。在这种情况下,退避将无济于事。
  • 一些 500 错误与负载有关,可以重试。有些是请求或服务器应用程序中的错误,无论您重试多少次,都将永远无法工作。它们之间的比例可以是任何东西,而不仅仅是 50:50
猜你喜欢
  • 2021-09-04
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
相关资源
最近更新 更多