Delphi 将文件作为表单的一部分过帐

Delphi 将文件作为表单的一部分过帐,delphi,indy10,delphi-xe8,Delphi,Indy10,Delphi Xe8,我正在尝试将文件和一些其他数据发布到我正在使用Delphi XE8编写的应用程序中的网站,但它不起作用。当我使用“Microsoft network monitor 3.4”监控网络流量时,文件仅部分发送,其他数据均不发送。我尝试了Indy 10和新的TNetHTTPClient,得到了相同的结果,这表明我做错了什么。请帮忙 印第路 procedure TMyClass.SendFile(aUrl: String); var mCookies: TIdCookieManager; pHt

我正在尝试将文件和一些其他数据发布到我正在使用Delphi XE8编写的应用程序中的网站,但它不起作用。当我使用“Microsoft network monitor 3.4”监控网络流量时,文件仅部分发送,其他数据均不发送。我尝试了Indy 10和新的TNetHTTPClient,得到了相同的结果,这表明我做错了什么。请帮忙

印第路

procedure TMyClass.SendFile(aUrl: String);
var
  mCookies: TIdCookieManager;
  pHttp: TIdHTTP;
  PostStream: TIdMultiPartFormDataStream;
  ResponseStream: TStringStream;
  fName, mimeStr: String;
begin
  fName := 'Image000.jpg';
  mCookies := TIdCookieManager.Create(nil);
  pHttp := TIdHTTP.Create(nil);
  pHttp.CookieManager := mCookies;
  PostStream:= TIdMultiPartFormDataStream.Create();
  ResponseStream := TStringStream.Create('');
  mimeStr := GetMIMETypeFromFile(fieldValue); // This returns 'image/pjpeg' instead of 'image/jpeg'. I have manually fixed it and it did not change the result
  PostStream.AddFile('sourceFile', fName, mimeStr);
  PostStream.AddFormField('name1', 'value1');
  PostStream.AddFormField('name2', 'value2');
  PostStream.AddFormField('name3', 'value3');
  PostStream.AddFormField('name4', 'value4');
  PostStream.AddFormField('name5', 'value5');
  .
  .
  .
  pHttp.Request.ContentType := PostStream.RequestContentType;
  pHttp.Request.Accept := '*/*';
  pHttp.Request.AcceptLanguage := 'en-us,en';
  pHttp.Request.AcceptEncoding := 'gzip, deflate';
  pHttp.Post(aUrl, PostStream, ResponseStream); // Get a 500 error from server for bad data
  .
  .
  .
  PostStream.Free();
  ResponseStream.Free();
  mCookies.Free();
  pHttp.Free();
end;
顺便说一下,GetMIMETypeFromFile返回了错误的值,但即使我硬编码了正确的值,也不会有任何不同

新的XE8方式

procedure TMyClass.SendFile(aUrl: String);
var
  mCookies: TCookieManager;
  pHttp: TNetHTTPClient;
  fName: String;
  mpFormData: TMultipartFormData;
  respData: IHTTPResponse;
begin
  fName := 'Image000.jpg';
  mCookies := TCookieManager.Create();
  pHttp := TNetHTTPClient.Create(nil);
  pHttp.CookieManager := mCookies;
  mpFormData := TMultipartFormData.Create();
  mpFormData.AddFile('sourceFile', fName);
  mpFormData.AddField('name1', 'value1');
  mpFormData.AddField('name2', 'value2');
  mpFormData.AddField('name3', 'value3');
  mpFormData.AddField('name4', 'value4');
  mpFormData.AddField('name5', 'value5');
  .
  .
  .
  pHttp.ContentType := 'multipart/form-data';
  pHttp.Accept := '*/*';
  pHttp.AcceptLanguage := 'en-us,en';
  pHttp.AcceptEncoding := 'gzip, deflate';
  mpFormData.Stream.Position := 0;
  respData := pHttp.Post(aUrl, mpFormData.Stream); //Same problem, error 500 here
  .
  .
  .
  mpFormData.Free();
  pHttp.Free();
  mCookies.Free();
end;
我知道服务器工作正常,因为另一个应用程序(用Intel XDA编写)工作正常。图像是有效的,在此之前我进行的所有Get调用也有效。 我真的需要帮助。 先谢谢你

当我使用“Microsoft network monitor 3.4”监控网络流量时,文件仅部分发送,其他数据均不发送

您确定监视器没有在其UI中显示部分数据吗?像Wireshark这样的数据包嗅探器会更可靠(或者将
TIdLog…
组件连接到
TIdHTTP
),因为它会向您显示实际传输的所有内容。发布
TIdMultipartFormDataStream
只会发送文件的一部分并完全跳过其他字段的唯一可能方式是在传输文件时断开套接字连接

mimeStr:=GetMIMETypeFromFile(fieldValue);//这将返回“image/pjpeg”而不是“image/jpeg”

在内部,
GetMIMETypeFromFile()
构建自己的硬编码MIME类型列表,然后使用操作系统信息覆盖该列表。为
.jpg
硬编码的默认值是
image/jpeg
。然后,当它查询操作系统时,它会看到
image/jpeg
image/pjpeg
(按该顺序)注册为
。jpg
,因此
image/pjpeg
。jpg
看到的最后一个MIME类型,这就是
GetMIMETypeFromFile()
最终返回的

pHttp.Request.ContentType:=PostStream.RequestContentType

您不需要它,Post()会在内部为您处理它

pHttp.Request.AcceptEncoding:=“gzip,deflate”

不要那样做
Post()
根据
TIdHTTP.Compressor
是否已分配并准备就绪,在内部为您处理

当我使用“Microsoft network monitor 3.4”监控网络流量时,文件仅部分发送,其他数据均不发送

您确定监视器没有在其UI中显示部分数据吗?像Wireshark这样的数据包嗅探器会更可靠(或者将
TIdLog…
组件连接到
TIdHTTP
),因为它会向您显示实际传输的所有内容。发布
TIdMultipartFormDataStream
只会发送文件的一部分并完全跳过其他字段的唯一可能方式是在传输文件时断开套接字连接

mimeStr:=GetMIMETypeFromFile(fieldValue);//这将返回“image/pjpeg”而不是“image/jpeg”

在内部,
GetMIMETypeFromFile()
构建自己的硬编码MIME类型列表,然后使用操作系统信息覆盖该列表。为
.jpg
硬编码的默认值是
image/jpeg
。然后,当它查询操作系统时,它会看到
image/jpeg
image/pjpeg
(按该顺序)注册为
。jpg
,因此
image/pjpeg
。jpg
看到的最后一个MIME类型,这就是
GetMIMETypeFromFile()
最终返回的

pHttp.Request.ContentType:=PostStream.RequestContentType

您不需要它,Post()会在内部为您处理它

pHttp.Request.AcceptEncoding:=“gzip,deflate”

不要那样做
Post()
根据
TIdHTTP.Compressor
是否已分配并准备就绪,在内部为您处理

当我使用“Microsoft network monitor 3.4”监控网络流量时,文件仅部分发送,其他数据均不发送

您确定监视器没有在其UI中显示部分数据吗?像Wireshark这样的数据包嗅探器会更可靠(或者将
TIdLog…
组件连接到
TIdHTTP
),因为它会向您显示实际传输的所有内容。发布
TIdMultipartFormDataStream
只会发送文件的一部分并完全跳过其他字段的唯一可能方式是在传输文件时断开套接字连接

mimeStr:=GetMIMETypeFromFile(fieldValue);//这将返回“image/pjpeg”而不是“image/jpeg”

在内部,
GetMIMETypeFromFile()
构建自己的硬编码MIME类型列表,然后使用操作系统信息覆盖该列表。为
.jpg
硬编码的默认值是
image/jpeg
。然后,当它查询操作系统时,它会看到
image/jpeg
image/pjpeg
(按该顺序)注册为
。jpg
,因此
image/pjpeg
。jpg
看到的最后一个MIME类型,这就是
GetMIMETypeFromFile()
最终返回的

pHttp.Request.ContentType:=PostStream.RequestContentType

您不需要它,Post()会在内部为您处理它

pHttp.Request.AcceptEncoding:=“gzip,deflate”

不要那样做
Post()
根据
TIdHTTP.Compressor
是否已分配并准备就绪,在内部为您处理

当我使用“Microsoft network monitor 3.4”监控网络流量时,文件仅部分发送,其他数据均不发送

你确定显示器是简单的吗