繁体   English   中英

错误500使用Delphi Indy上传文件失败

[英]Error 500 Failed to upload file using Delphi Indy

我正在尝试将文件上传到oboom.com我成功登录但是当尝试发布文件时我得到了该错误

HTTP / 1.1500内部服务器错误。

用这个respose文本

[500,"illegal post header","Content-Transfer-Encoding"]

procedure TForm1.Button1Click(Sender: TObject);
var
  S: tstringlist;
  html: string;
  clHttpRequest1: tclHttpRequest;
  SSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
  params: TIdMultiPartFormDataStream;
  HTTP, HTTP2: tidhttp;
begin
  params := TIdMultiPartFormDataStream.Create;
  S := tstringlist.Create;
  HTTP2 := tidhttp.Create(nil);
  try
    cookie := tidcookiemanager.Create(nil);
    SSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    HTTP2.IOHandler := SSLIOHandlerSocketOpenSSL;
    HTTP2.HandleRedirects := False;
    HTTP2.ConnectTimeout := 10000;
    HTTP2.ReadTimeout := 10000;
    HTTP2.CookieManager := cookie;
    HTTP2.AllowCookies := True;
    HTTP2.Request.UserAgent :=
      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36';
    HTTP2.Request.ContentType := 'application/x-www-form-urlencoded';
    HTTP2.Request.ContentEncoding := 'gzip, deflate';
    HTTP2.Request.Accept := '*/*';
    HTTP2.Request.Connection := 'Keep-Alive';
    S.Values['auth'] := 'email@gmail.com';
    S.Values['pass'] := 'password';
    S.Values['app_id'] := '5hwaJUcDicXprlV3gjaB';
    S.Values['app_session'] := '288196272';
    html := HTTP2.Post('https://www.oboom.com/1.0/login', S);
  finally
    HTTP2.Free;
    S.Free;
  end;
  token := ExtractBetween(html, 'session":"', '"');
  try
    HTTP := tidhttp.Create;
    HTTP.HandleRedirects := True;
    HTTP.Request.Connection := 'keep-alive';
    HTTP.AllowCookies := True;
    HTTP.CookieManager := cookie;
    HTTP.Request.Referer := 'http://upload.oboom.com';
    HTTP.Request.ContentType :=
      'multipart/form-data; boundary=----------GI3Ef1cH2GI3gL6ae0Ef1KM7Ef1gL6';
    HTTP.Request.Accept := '*/*';
    HTTP.Request.AcceptEncoding := 'gzip,deflate';
    HTTP.ConnectTimeout := 20000;
    HTTP.ReadTimeout := 20000;
    HTTP.Request.UserAgent :=
      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36';
    params.AddFile('file', 'C:\Users\M\Pictures\Martin.jpg', );
    HTTP.Post('http://upload.oboom.com/1.0/ul?token=' + token +
      '&parent=1&name_policy=rename', params);
  finally
    HTTP.Free;
    params.Free;
    cookie.Free;
  end;
  memo1.Text := html;
end;

我用Google搜索了几个小时的解决方案,但没有运气:/

试过这种方式:

 Params.AddFile('file', 'C:\Users\M\Pictures\Martin.jpg','application/octet-stream');
 Params.AddFile('file', 'C:\Users\M\Pictures\Martin.jpg','multipart/form-data');

但同样的错误

我已经尝试过聪明的互联网功能并成功上传文件,但我想使用indy ..

我使用delphi X3

你需要摆脱这些线:

HTTP2.Request.ContentEncoding := 'gzip, deflate';

HTTP.Request.AcceptEncoding := 'gzip,deflate';

TIdHTTP根据是否已分配和启用Compressor属性来为您管理这些值。 并且,您没有发送压缩请求,因此无论如何都不应使用这些值。

此外,你需要摆脱这一行:

HTTP.Request.ContentType :=
  'multipart/form-data; boundary=----------GI3Ef1cH2GI3gL6ae0Ef1KM7Ef1gL6';

Post()为您管理该值,尤其是TIdMultipartFormDtaStream动态生成的boundary

更新使用Content-Transfer-Encoding的唯一其他位置是TIdMultipartFormDataStream的各个字段。 每个TIdFormDataField都有一个ContentTransfer属性。 AddFile()将其初始化为'binary' ,但您也可以将其设置为空字符串以禁用标题:

params.AddFile(...).ContentTransfer := '';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM