user3140961
user3140961

Reputation:

Uploading a bitmap with idHTTP from a Delphi 10.3 multidevice app

I have read many related posts about sending data with idHTTP but still I can't manage it. I use this code :

updated

procedure TTabbedForm.SpeedButton1Click(Sender: TObject);
var
    fName       : string;
     mStream : TMemoryStream;
begin
    fName := 'image.jpg';
    mStream := TMemoryStream.Create;
    myImage.Bitmap.SaveToStream(mStream);
    mStream.Position := 0;
    try
            IdHTTP1.Request.ContentType := 'application/octet-stream';
            IdHTTP1.PUT('http://www.example.com/'+fName, mStream);
    finally
            mStream.free;
    end;
end;

but i receive the error "Method not allowed". What i'm doing wrong, please ?

Upvotes: 0

Views: 891

Answers (1)

mjn
mjn

Reputation: 36654

For uploads to Google Drive, some additional steps are required. For example, the HTTP POST request must include a auth token which in turn is provided to you only after authentication (log in with a Google account). For Google Drive you must also use secure connections (https) which require SSL libraries such as OpenSSL.

Example from the API docs:

POST https://www.googleapis.com/upload/drive/v3/files?uploadType=media HTTP/1.1
Content-Type: image/jpeg
Content-Length: [NUMBER_OF_BYTES_IN_FILE]
Authorization: Bearer [YOUR_AUTH_TOKEN]

[JPEG_DATA]

The file simple upload API for Google Drive is documented here:

https://developers.google.com/drive/api/v3/simple-upload


Update

Try this example, it requires a valid auth token:

procedure TDriveAPITest.Run;
var
  PostData: TStream;
  Response: string;
begin
  PostData := TFileStream.Create('test.png', fmOpenRead or fmShareDenyWrite);
  try
    IdHTTP := TIdHTTP.Create;
    try
      IdHTTP.HTTPOptions := IdHTTP.HTTPOptions + [hoNoProtocolErrorException];
      IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer [YOUR_AUTH_TOKEN]';

      Response := IdHTTP.Post('https://www.googleapis.com/upload/drive/v3/files?uploadType=media', PostData);

      if IdHTTP.ResponseCode = 200 then begin
        WriteLn('Response: ' + Response);
      end else begin
        WriteLn('Error: ' + IdHTTP.ResponseText);
      end;
    finally
      IdHTTP.Free;
    end;
  finally
    PostData.Free;
  end;
end; 

Output:

Error: HTTP/1.0 401 Unauthorized

Upvotes: 1

Related Questions