Google Drive API - 仅更新文件元数据

时间:2017-08-16 12:43:38

标签: google-api google-drive-api google-apis-explorer

我正在尝试重命名google驱动器文件资源。我想我只是遗漏了一些东西,因为所有其他操作,如获取文件列表,插入文件,在目录之间移动文件都有效。

前提条件:尝试使用带有java的文档https://developers.google.com/drive/v2/reference/files/update重命名文件资源(仅使用JDK)。另外,我不使用gdrive java sdk,apache http客户端或其他库...只需清理JDK工具。

所以我做的是:

  1. Here是我要发送的文件元数据。

  2. 修改此元数据中的title属性

  3. 以下是代码:

    URLConnection urlConnection = new URL("https://www.googleapis.com/drive/v2/files/" + fileId).openConnection();
    
    if (urlConnection instanceof HttpURLConnection) {
        HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
        httpURLConnection.setRequestMethod("PUT");
        httpURLConnection.setDoOutput(true);
        httpURLConnection.setRequestProperty("Authorization", "Bearer " + accessToken);
    
        DataOutputStream outputStream = new DataOutputStream(httpURLConnection.getOutputStream());
        outputStream.writeBytes(FILE_RESOURCE_METADATA_WITH_CHANGED_TITLE_IN_JSON);
        outputStream.flush();
        outputStream.close();
    }
    
  4. 在对API进行实际调用后,我在响应正文中收到200状态代码和文件资源(如预期的那样),但标题保持不变。所以我没有错误没有改变标题。

    此外,谷歌驱动器API忽略了文件资源的任何变化。它只返回相同的文件资源而不应用任何更改(尝试使用title,description,originalFileName,parents属性)。

    到目前为止我还尝试了什么:

    1. 仅发送应更改的属性,例如

      {"title":"some_new_name"}
      
    2. 结果相同。

      1. PUT更改为PATCH。不幸的是,HttpURLConnection不支持PATCH,但解决方法给出了相同的结果。更改将被忽略。

      2. 使用google api exlorer(可以在API参考页面的右侧找到) - 并且...它有效。在请求正文中仅填写fileId和title属性并且它有效。文件已重命名。

      3. 我缺少什么?

2 个答案:

答案 0 :(得分:0)

尝试documentation中提供的示例java代码。

由于代码处理更新现有文件的元数据和内容。

从代码中,您会发现file.setTitle(newTitle)我认为您想要实现的那个。

import com.google.api.client.http.FileContent;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.model.File;

import java.io.IOException;
// ...

public class MyClass {

  // ...

  /**
   * Update an existing file's metadata and content.
   *
   * @param service Drive API service instance.
   * @param fileId ID of the file to update.
   * @param newTitle New title for the file.
   * @param newDescription New description for the file.
   * @param newMimeType New MIME type for the file.
   * @param newFilename Filename of the new content to upload.
   * @param newRevision Whether or not to create a new revision for this
   *        file.
   * @return Updated file metadata if successful, {@code null} otherwise.
   */
  private static File updateFile(Drive service, String fileId, String newTitle,
      String newDescription, String newMimeType, String newFilename, boolean newRevision) {
    try {
      // First retrieve the file from the API.
      File file = service.files().get(fileId).execute();

      // File's new metadata.
      file.setTitle(newTitle);
      file.setDescription(newDescription);
      file.setMimeType(newMimeType);

      // File's new content.
      java.io.File fileContent = new java.io.File(newFilename);
      FileContent mediaContent = new FileContent(newMimeType, fileContent);

      // Send the request to the API.
      File updatedFile = service.files().update(fileId, file, mediaContent).execute();

      return updatedFile;
    } catch (IOException e) {
      System.out.println("An error occurred: " + e);
      return null;
    }
  }

  // ...
}

希望这会给你一些观点。

答案 1 :(得分:0)

找到解决方案......

添加此请求属性修复了问题。

httpURLConnection.setRequestProperty("Content-Type", "application/json")