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
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.
Kann jemand vorschlagen, wie Sie einen Dateinamen geben/die Datei mit dem gleichen Namen in Google Drive hochladen.
Haben Sie Debugging durchgeführt? Haben Sie sich den Inhalt der von Ihnen gesendeten Anfrage angesehen? –
@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? –
Dennoch müssen Sie dies debuggen. Welche Codezeile erzeugt diesen Fehler? Was ist der Stack-Trace? –