Файлы загружаются на диск Google с именем без названия в Delphi

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

введите здесь описание изображения Ниже приведен код, который я написал для загрузки на диск.

     local_filename:= 'D:/Capture.jpg';
{$ENDIF}
  RESTResponseDataSetAdapter.AutoUpdate :=false;
  RESTRequest.Params.Clear;
RESTRequest.Method := TRESTRequestMethod.rmPOST;
RESTRequest.AddParameter('application/json; charset=utf-8','{"title": "Capture.jpg"}',TRESTRequestParameterKind.pkREQUESTBODY);

  RESTClient.BaseURL := 'https://www.googleapis.com/upload/drive/v2';
  RESTRequest.Resource := '/files?uploadType=multipart';

  upload_stream := TFileStream.Create(local_filename,fmOpenRead);
  upload_stream.Position := 0
 RESTRequest.Addbody(upload_stream, TRESTContentType.ctIMAGE_JPEG);
RESTRequest.Execute;

Может кто-нибудь подсказать, как дать имя файлу/загрузить файл с таким же именем на гугл диск.


person G_S    schedule 21.04.2016    source источник


Ответы (2)


См. ссылку на REST API Google Диска https://developers.google.com/drive/v2/web/manage-uploads#multipart. Вы должны отправить «метаданные». Есть 2 варианта. Вы выполняете эту простую загрузку, а затем вызываете другой запрос на обновление метаданных этого файла. Или вы можете сделать многокомпонентную загрузку и добавить параметр. Это должно работать, но похоже, что запрос REST не поддерживает этот метод.

RESTRequest.Method := TRESTRequestMethod.rmPOST;
RESTRequest.Params.AddItem('metadata', '{"title": "YourFileName.dat"}', TRESTRequestParameterKind.pkREQUESTBODY, [], TRESTContentType.ctAPPLICATION_JSON);

Поэтому решение состоит в том, чтобы обновить метаданные после вашего запроса

var
  s: string
RESTRequest1.Response.GetSimpleValue('id', s);

RESTRequest1.Params.Clear;
RESTClient1.BaseURL := 'https://www.googleapis.com/drive/v2/files/'+s;
RESTRequest1.Resource := '';
RESTRequest1.Method:=TRESTRequestMethod.rmPUT;
RESTRequest1.AddBody('{"title": "Capture.jpg"}', TRESTContentType.ctAPPLICATION_JSON);
RESTRequest1.Execute;
person smooty86    schedule 21.04.2016

AddBody(), по-видимому, заменяет AddParameter(), поэтому вы стираете свои метаданные JSON. Это указано в AddBody() документации:

Как правило, вызов AddBody заменяет любое предыдущее значение параметра body. Однако, если вы передаете ABodyContent в виде строки, указанное значение добавляется, а результирующий запрос содержит несколько параметров тела.

Метаданные JSON и файл JPG необходимо отправить вместе в теле запроса в формате multipart/related. Однако, глядя на TRESTRequest, я не вижу простого способа отправлять запросы в таком формате (здесь я могу ошибаться). Возможно, вам придется поместить все данные multipart в один TStream и передать его в AddBody() с ContentType TRESTContentType.ctMULTIPART_RELATED. Если вы попытаетесь добавить различные фрагменты в качестве отдельных параметров, будет отправлен неправильный тип контента:

В запросе с одним параметром используется application/x-www-form-urlencoded, а в запросе с несколькими параметрами используется multipart/mixed.

person Remy Lebeau    schedule 21.04.2016