【问题标题】:Uploading a bitmap with idHTTP from a Delphi 10.3 multidevice app从 Delphi 10.3 多设备应用程序上传带有 idHTTP 的位图
【发布时间】:2019-02-28 20:23:02
【问题描述】:

我已经阅读了许多有关使用 idHTTP 发送数据的相关帖子,但我仍然无法管理它。 我使用此代码:

更新

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;

但我收到错误“方法不允许”。 请问我做错了什么?

【问题讨论】:

  • 要么您的 URL 不正确,要么服务器不允许您使用的 URL 放置。
  • 需要指定完整的url,包括前导http://https://方案组件
  • 实际上我在 URL 中包含了 http:// 但 stackoverflow 的编辑器不允许它。所以我没有展示。我认为服务器不允许使用 put 命令。也许允许发布命令,但在这种情况下我如何上传流?
  • @JimPapas TIdHTTP 有其Post() 发布流的方法的重载。但是您需要知道要使用哪种流。服务器是否允许发布原始数据,还是需要将其包装在 MIME 中?它有很大的不同。您的服务器实际上期望什么?是否记录在案?它是我们可以查看的公共服务器吗?
  • Remmy 我想将流上传到这个 URL 'drive.google.com/open?id=1U9wTzrHmttbo1tQrwsTjcdXsboKG40Ah'

标签: http delphi upload idhttp


【解决方案1】:

要上传到 Google 云端硬盘,需要执行一些额外的步骤。例如,HTTP POST 请求必须包含一个身份验证令牌,而该令牌仅在身份验证后才提供给您(使用 Google 帐户登录)。对于 Google Drive,您还必须使用需要 SSL 库(例如 OpenSSL)的安全连接 (https)。

API 文档中的Example

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]

Google Drive 的文件简单上传 API 记录在这里:

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


更新

试试这个例子,它需要一个有效的身份验证令牌:

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; 

输出:

Error: HTTP/1.0 401 Unauthorized

【讨论】:

  • 我发现很难将示例转换为 delphi 代码。如果有人可以提供一些帮助,我将不胜感激
  • 首先,我要感谢您的回复。我尝试了您的代码(稍作更改)并收到错误消息:套接字错误 #10053 软件导致连接中止。我修改了你的代码如下:
  • 如果不是 imageEdit.Bitmap.IsEmpty 然后开始 mStream := TMemoryStream.Create; ImageEdit.Bitmap.SaveToStream(mStream); mStream.Position := 0;尝试 IdHTTP1.HTTPOptions := IdHTTP1.HTTPOptions + [hoNoProtocolErrorException]; IdHTTP1.Request.CustomHeaders.Add('Authorization: Bearer [YOUR_AUTH_TOKEN]');响应:= IdHTTP1.Post('googleapis.com/upload/drive/v3/files?uploadType=media HTTP/1.1', mStream);如果 IdHTTP1.ResponseCode = 200 然后开始 ... 否则 .....;
  • @JimPapas 该程序使用安全连接 (https),​​因此它需要 OpenSSL 库
  • 是的,我将它们放在应用程序的目录中,并且我已将 idSSLIOHandlerSocketOpenSSL1 分配给 idHTTP1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 2016-09-04
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
相关资源
最近更新 更多