Google Drive API - обновлять только метаданные файлов

Я пытаюсь переименовать файловый ресурс диска Google. Я предполагаю, что мне просто чего-то не хватает, поскольку все остальные действия, такие как получение списка файлов, вставка файлов, перемещение файлов между каталогами, работают.

Предварительное условие: попытка переименовать файловый ресурс с помощью этого документа https://developers.google.com/drive/v2/reference/files/update с java (только с JDK). Кроме того, я не использую gdrive java sdk, http-клиент apache или другие библиотеки ... Просто очистите инструменты JDK.

Итак, что я делаю:

  1. Вот метаданные файла, которые я пытаюсь отправить.

  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();
    }
    

После фактического вызова API я получаю код состояния 200 и ресурс файла в теле ответа (как и ожидалось), но заголовок остается прежним. Так что я не получил ни одной ошибки, ни названия не изменилось.

Более того, api диска Google игнорирует любые изменения файлового ресурса. Он просто возвращает тот же файловый ресурс без каких-либо изменений (пробовал с заголовком, описанием, исходным именем файла, родительскими свойствами).

Что я пробовал до сих пор:

  1. Отправка только тех свойств, которые нужно изменить, например

    {"title":"some_new_name"}
    

Результат такой же.

  1. Изменение PUT на PATCH. К сожалению, PATCH не поддерживается HttpURLConnection, но обходные пути дали те же результаты. Изменения игнорируются.

  2. Использовал google api exlorer (который можно найти в правой части справочной страницы API) - и ... он работает. Заполнил только свойство fileId и title в теле запроса, и это сработало. Файл переименован.

Что мне не хватает?


person shvetsroman    schedule 16.08.2017    source источник


Ответы (2)


Нашел решение ...

Добавление этого свойства запроса устранило проблему.

httpURLConnection.setRequestProperty("Content-Type", "application/json")
person shvetsroman    schedule 17.08.2017

Попробуйте использовать образец кода 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;
    }
  }

  // ...
}

Надеюсь, это даст вам несколько очков.

person MαπμQμαπkγVπ.0    schedule 17.08.2017