2016-04-19 17 views
0

Ich versuche, Dateien auf Google Drive mit RestAPI in Delphi hochzuladen. Es ist jedoch nicht möglich, Dateien in Google Drive hochzuladen. Authentifizierung zu Google Drive erfolgreich, aber Fehler beim Hochladen von Dateien. Unten ist die Fehlermeldung, die ich bekomme.Fehler beim Hochladen von Dateien auf Google Drive in Delphi

enter image description here

Hier ist mein Code:

var 
    LURL: string; 
    wv: Tfrm_OAuthWebForm; 
    LToken: string; 
    parents: TJSONArray; 
    Folder: TJSONObject; 
    upload_stream:TFileStream; 
local_filename : string; 
ttt: TJSONObject; 
begin 
    edt_GoogleTasks_AuthCode.Text := ''; 
    edt_GoogleTasks_AccessToken.Text := ''; 
    edt_GoogleTasks_RefreshToken.Text := ''; 

    /// step #1: get the auth-code 
    LURL := 'https://accounts.google.com/o/oauth2/auth'; 
    LURL := LURL + '?response_type=' + URIEncode('code'); 
    LURL := LURL + '&client_id=' + URIEncode(edt_GoogleTasks_ClientID.Text); 
    LURL := LURL + '&redirect_uri=' + URIEncode('urn:ietf:wg:oauth:2.0:oob'); 
    LURL := LURL + '&scope=' + URIEncode('https://www.googleapis.com/auth/tasks'); 
    // optional 
    // LURL := LURL + '&login_hint=' + URIEncode('[email protected]'); 

    wv := Tfrm_OAuthWebForm.Create(self); 
    try 
    wv.OnTitleChanged := self.OAuth2_GoogleTasks_BrowserTitleChanged; 
    wv.ShowModalWithURL(LURL); 
    finally 
    wv.Release; 
    end; 

    /// step #2: get the access-token 

    ResetRESTComponentsToDefaults; 

    RESTClient.BaseURL := 'https://accounts.google.com/'; 

    RESTRequest.Method := TRESTRequestMethod.rmPOST; 
    RESTRequest.Resource := 'o/oauth2/token'; 
    RESTRequest.Params.AddItem('code', edt_GoogleTasks_AuthCode.Text, TRESTRequestParameterKind.pkGETorPOST); 
    RESTRequest.Params.AddItem('client_id', edt_GoogleTasks_ClientID.Text, TRESTRequestParameterKind.pkGETorPOST); 
    RESTRequest.Params.AddItem('client_secret', edt_GoogleTasks_ClientSecret.Text, TRESTRequestParameterKind.pkGETorPOST); 
    RESTRequest.Params.AddItem('redirect_uri', 'urn:ietf:wg:oauth:2.0:oob', TRESTRequestParameterKind.pkGETorPOST); 
    RESTRequest.Params.AddItem('grant_type', 'authorization_code', TRESTRequestParameterKind.pkGETorPOST); 

    RESTRequest.Execute; 

    if RESTRequest.Response.GetSimpleValue('access_token', LToken) then 
    // edt_GoogleTasks_AccessToken.Text := LToken; 
    OAuth2_GoogleTasks.AccessToken := LToken; 
    if RESTRequest.Response.GetSimpleValue('refresh_token', LToken) then 
    // edt_GoogleTasks_RefreshToken.Text := LToken; 
    OAuth2_GoogleTasks.RefreshToken := LToken; 

    {$IF DEFINED(MsWindows)} 
    local_filename := ExtractFilePath(ParamStr(0)) +'Sanjeev.txt'; 
{$ENDIF} 
RESTResponseDataSetAdapter.AutoUpdate := false; 
RESTRequest.Params.Clear; 
           RESTRequest.ClearBody; 
//RESTRequest.Method:=rmpost; 
//try 
RESTClient.BaseURL :=  'https://www.googleapis.com/upload/drive/v2/files?'; 



     upload_stream := TFileStream.Create(local_filename,fmOpenReadWrite); 
    upload_stream.Position := 0; 
RESTRequest.AddBody(upload_stream,  TRESTContentType.ctAPPLICATION_OCTET_STREAM); 

try 
    RESTRequest.Execute;//Exception line 
except 
on e: Exception do 
begin 
    ShowMessage(e.Message); 
    end; 
     end; 
    upload_stream.Free; 

Edit:

Schließlich ich in der Lage war, eine Datei zu laden Laufwerk googeln. Ich habe die API url geändert, die ich vorher als LURL := LURL + '&scope=' + URIEncode('https://www.googleapis.com/auth/tasks') eingestellt habe. Ich habe es in LURL := LURL + '&scope=' + URIEncode('https://www.googleapis.com/auth/drive') geändert und jetzt wird die Datei korrekt hochgeladen.

Alles schien gut. Aber mir ist aufgefallen, dass die Datei mit unbenanntem Dateinamen wie im folgenden Bild hochgeladen wird.

enter image description here

Kann jemand vorschlagen, wie Sie einen Dateinamen geben/die Datei mit dem gleichen Namen in Google Drive hochladen.

+0

Haben Sie Debugging durchgeführt? Haben Sie sich den Inhalt der von Ihnen gesendeten Anfrage angesehen? –

+0

@DavidHeffernan, ich debuggte und fand, dass ich verpasste, eine Zeile hinzuzufügen. Ich habe hinzugefügt und jetzt sehe ich andere Ausnahme. Ich habe die Frage mit dem gleichen bearbeitet. Können Sie mir bitte vorschlagen, was diesen Fehler verursacht? –

+0

Dennoch müssen Sie dies debuggen. Welche Codezeile erzeugt diesen Fehler? Was ist der Stack-Trace? –

Antwort

1

Endlich konnte ich eine Datei auf Google Drive hochladen. Ich habe die API url geändert, die ich vorher als LURL := LURL + '&scope=' + URIEncode('https://www.googleapis.com/auth/tasks') eingestellt habe. Ich habe es in LURL := LURL + '&scope=' + URIEncode('https://www.googleapis.com/auth/drive') geändert und jetzt wird die Datei korrekt hochgeladen.

Verwandte Themen