2015-08-31 8 views
0

Я пытаюсь загрузить файл на Google Drive с помощью OAuth2Authenticator1, RESTClient1, RESTRequest1, RESTResponse1. Я уже получил токен доступа для области: https://www.googleapis.com/auth/drive, и все в порядке. Теперь я пытаюсь загрузить текстовый файл, используя следующую процедуру:Delphi xe7 Rest to google drive api

procedure UploadtoDriveMy; 
var 
LURL:String; 
cloud_path:String; 
upload_stream:TFileStream; 
local_filename : string; 
begin 
{$IF DEFINED(MsWindows)} 
     local_filename := ExtractFilePath(ParamStr(0)) +'Test.txt'; 
{$ENDIF} 
cloud_path:= 'MyFolder'; 
LURL:= '/'+ HttpEncode(cloud_path)+'/'; 
form2.RESTResponseDataSetAdapter1.AutoUpdate := false; 
form2.RESTRequest1.Method := form2.RESTRequestput.Method; 
form2.RESTClient1.BaseURL := 'https://www.googleapis.com/upload/drive/v2/files'; 
form2.RESTRequest1.Resource := LURL; 
upload_stream := TFileStream.Create(local_filename,fmOpenRead); 
upload_stream.Position := 0; 
form2.RESTRequest1.Params.AddHeader('Content-Type', 'text'); 
form2.RESTRequest1.ClearBody; 
form2.RESTRequest1.AddBody(upload_stream,TRESTContentType.ctTEXT_PLAIN); 
try 
    form2.RESTRequest1.Execute; 
except 
on e: Exception do 
begin 
ShowMessage(e.Message); 
end; 
end; 
upload_stream.Free; 
end; 

Я Allready вручную создать эту папку на Google Диск «MyFolder». HttpAnalyzer показывает:

PUT /upload/drive/v2/files/MyFolder/ HTTP/1.1 
Content-Type: text/plain; charset=ISO-8859-1 
Content-Length: 6 
Content-Type: text 
Authorization: Bearer  ya29.4AHLd5h0Rqc0oNPfOEUqYxCXRVMelg8x5C0AVlYPGU8fRzf3h_lDHB-KPT8cky_ZP8Pd 
Host: www.googleapis.com 
Accept: application/json, text/plain; q=0.9, text/html;q=0.8, 
Accept-Charset: UTF-8, *;q=0.8 
Accept-Encoding: identity 
User-Agent: Embarcadero RESTClient/1.0 

TestMY 

И Google возвращает:

HTTP/1.1 400 Bad Request 
X-GUploader-UploadID: AEnB2UqMZW-wi1n28e_6klMgjju8F85VV-  BQ3TGiTPNR6j0_WX0muytirWKHL0_2TboT8tKYWcIHoQc6hrDz05s3T1WdZ-gS0w 
Vary: Origin 
Vary: X-Origin 
Content-Type: application/json; charset=UTF-8 
Content-Length: 171 
Date: Mon, 31 Aug 2015 11:19:24 GMT 
Server: UploadServer 
Alternate-Protocol: 443:quic,p=1 
Alt-Svc: quic=":443"; p="1"; ma=604800 

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "parseError", 
    "message": "Parse Error" 
    } 
    ], 
    "code": 400, 
    "message": "Parse Error" 
} 
} 

Так что я не могу понять, что случилось с этой процедурой, кто может мне помочь?

+0

Немного длинный снимок, но вы подтвердили, что ваш «local_filename: = ...» на самом деле выполняется? – MartynA

+0

Кроме того, в дополнение к комментарию @ MartynA ваш файл определенно является текстовым файлом? –

+0

Вы не должны добавлять «/ MyFolder /» там. Никаких случайных изменений пути. Google не поддерживает такие папки, как на вашем компьютере. Папки Google обрабатываются с помощью специальных идентификаторов, которые должны быть переданы с использованием метаданных. – smooty86

ответ

0

Ну, я могу изменить его таким образом, и его работы:

procedure UploadtoDriveMyGolden2File; 
var 
upload_stream:TFileStream; 
local_filename : string; 
ttt: TJSONObject; 
begin 
{$IF DEFINED(MsWindows)} 
    local_filename := ExtractFilePath(ParamStr(0)) +'Northwindpers1.sqlite3'; 
{$ENDIF} 
form2.RESTResponseDataSetAdapter1.AutoUpdate := false; 
form2.RESTRequest1.Params.Clear; 
form2.RESTRequest1.ClearBody; 
form2.RESTRequest1.Method:=rmpost; 
form2.RESTClient1.BaseURL :=  'https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart'; 
    upload_stream := TFileStream.Create(local_filename,fmOpenRead); 
    upload_stream.Position := 0; 

    //Here I'm Trying to change title of uploaded file, but its doesnt work 
    //ttt:= TJSONObject.create; 
    //ttt.AddPair(TJSONPair.Create('Title', 'MyFile')); 
    //form2.RESTRequest1.AddBody(ttt); 
    //form2.RESTRequest1.AddParameter('Title','MyFile',TRESTRequestParameterKind.pkREQUESTBODY); 

    form2.RESTRequest1.AddBody(upload_stream,  TRESTContentType.ctAPPLICATION_OCTET_STREAM); 
try 
    form2.RESTRequest1.Execute; 
except 
on e: Exception do 
begin 
    ShowMessage(e.Message); 
    end; 
    end; 
    upload_stream.Free; 
//ttt.Free; 
    end; 

Но, к сожалению, я не могу добавить { «название»: «Myfile»} строительство, чтобы изменить имя загруженного файла. Я пробовал объект JSON и TRESTRequestParameterKind.pkREQUESTBODY, но это бесполезно ... Любые идеи?

Также здесь Папка создания процедура

procedure CreateFolder; 
var 
    parents: TJSONArray; 
    Folder: TJSONObject; 
begin 
    form2.RESTResponseDataSetAdapter1.AutoUpdate := false; 
    form2.RESTRequest1.Params.Clear; 
    form2.RESTRequest1.ClearBody; 
    form2.RESTRequest1.Method:=rmpost; 
    form2.RESTClient1.BaseURL := 'https://www.googleapis.com/drive/v2/files'; 
//Это вставка объекта 
    Parents:= TJSONArray.Create; 
    Folder:= TJSONObject.create; 
     Folder.AddPair(TJSONPair.Create('Title', 'MyFolder1')); 
     Folder.AddPair(TJSONPair.Create('mimeType', 'application/vnd.google-apps.folder')); 
     Folder.AddPair(TJSONPair.Create('Parents', Parents)); 
    form2.RESTRequest1.AddBody(Folder); 
try 
    form2.RESTRequest1.Execute; 
except 
on e: Exception do 
begin 
    ShowMessage(e.Message); 
end; 
end; 
Folder.Free; 
Parents.Free; 
end; 

Но опять-таки это создает папку с безымянным именем :(

Для загрузки я использую это:

procedure DownloadfromDriveMyGolden2File; 
begin 

    form2.RESTResponseDataSetAdapter1.AutoUpdate := false; 
    form2.RESTRequest1.Params.Clear; 
    form2.RESTRequest1.ClearBody; 
    form2.RESTRequest1.Method:=rmget; 
    Form2.RESTClient1.BaseURL:='https://www.googleapis.com/drive/v2/files/{FileId}'; 
    form2.RESTRequest1.Resource := ''; 
    form2.RESTRequest1.Params.AddUrlSegment('FileId', form2.Edit4.Text); 
try 
    form2.RESTRequest1.Execute; 

except 
on e: Exception do 
begin 
    ShowMessage(e.Message);//Show Exception 
end; 
end; 
end; 

FILEID является документ ID, который я получить от разобранного JSON List, но я не знаю, какой компонент использовать для сохранения Tfilestream на моем жестком диске.

+0

Обратите внимание, что это не дискуссионный форум. Вы не можете спрашивать у anwer. В любом случае, если вам нужны расширенные настройки загрузки, вы не должны использовать простой метод загрузки. Есть альтернативы - но более сложные. – smooty86