delphi中通过TIdhttp控件上载文件

原创 2007年09月12日 17:44:00
附带的例子由于indy版本的问题,有点小问题(其实用文本工具修改一下dfm,去掉新增的属性就可以了)。我干脆把源码给贴出来吧,版权属于原作者
一.用于实现form流格式的单元(MsMultiPartFormData.pas)
unit MsMultiPartFormData;
interface
uses
SysUtils, Classes;
const
CONTENT_TYPE = 'multipart/form-data; boundary=';
CRLF = #13#10;
CONTENT_DISPOSITION = 'Content-Disposition: form-data; name="%s"';
FILE_NAME_PLACE_HOLDER = '; filename="%s"';
CONTENT_TYPE_PLACE_HOLDER = 'Content-Type: %s' + crlf + crlf;
CONTENT_LENGTH = 'Content-Length: %d' + crlf;
type
TMsMultiPartFormDataStream = class(TMemoryStream)
private
FBoundary: string;
FRequestContentType: string;
function GenerateUniqueBoundary: string;
public
procedure AddFormField(const FieldName, FieldValue: string);
procedure AddFile(const FieldName, FileName, ContentType: string; FileData: TStream); overload;
procedure AddFile(const FieldName, FileName, ContentType: string); overload;
procedure PrepareStreamForDispatch;
constructor Create;
property Boundary: string read FBoundary;
property RequestContentType: string read FRequestContentType;
end;
implementation
{ TMsMultiPartFormDataStream }
constructor TMsMultiPartFormDataStream.Create;
begin
inherited;
FBoundary := GenerateUniqueBoundary;
FRequestContentType := CONTENT_TYPE + FBoundary;
end;
procedure TMsMultiPartFormDataStream.AddFile(const FieldName, FileName,
ContentType: string; FileData: TStream);
var
sFormFieldInfo: string;
Buffer: PChar;
iSize: Int64;
begin
iSize := FileData.Size;
sFormFieldInfo := Format(CRLF + '--' + Boundary + CRLF + CONTENT_DISPOSITION +
FILE_NAME_PLACE_HOLDER + CRLF + CONTENT_LENGTH +
CONTENT_TYPE_PLACE_HOLDER, [FieldName, FileName, iSize, ContentType]);
Write(Pointer(sFormFieldInfo)^, Length(sFormFieldInfo));
FileData.Position := 0;
GetMem(Buffer, iSize);
try
FileData.Read(Buffer^, iSize);
Write(Buffer^, iSize);
finally
FreeMem(Buffer, iSize);
end;
end;
procedure TMsMultiPartFormDataStream.AddFile(const FieldName, FileName,
ContentType: string);
var
FileStream: TFileStream;
begin
FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
AddFile(FieldName, FileName, ContentType, FileStream);
finally
FileStream.Free;
end;
end;
procedure TMsMultiPartFormDataStream.AddFormField(const FieldName,
FieldValue: string);
var
sFormFieldInfo: string;
begin
sFormFieldInfo := Format(CRLF + '--' + Boundary + CRLF + CONTENT_DISPOSITION + CRLF + CRLF +
FieldValue, [FieldName]);
Write(Pointer(sFormFieldInfo)^, Length(sFormFieldInfo));
end;
function TMsMultiPartFormDataStream.GenerateUniqueBoundary: string;
begin
Result := '---------------------------' + FormatDateTime('mmddyyhhnnsszzz', Now);
end;
procedure TMsMultiPartFormDataStream.PrepareStreamForDispatch;
var
sFormFieldInfo: string;
begin
sFormFieldInfo := CRLF + '--' + Boundary + '--' + CRLF;
Write(Pointer(sFormFieldInfo)^, Length(sFormFieldInfo));
Position := 0;
end;
end.
二。调用的方法:
1。先包含MsMultiPartFormData(uses MsMultiPartFormData;)
2。把如下代码加到需要的地方
var
ResponseStream: TMemoryStream;
MultiPartFormDataStream: TMsMultiPartFormDataStream;
begin
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
ResponseStream := TMemoryStream.Create;
try
IdHttp1.Request.ContentType := MultiPartFormDataStream.RequestContentType;
//添加表单的字段 (前一个参数是字段名,后一个参数是字段值)
MultiPartFormDataStream.AddFormField('PersonName', edtPersonName.Text);
MultiPartFormDataStream.AddFormField('Description', edtDescription.Text);
//添加上载的文件(第一个是字段名,第二个是文件名,第三个是文件类型)
MultiPartFormDataStream.AddFile(edtFile.Name, edtFile.Text, edtMIMEType.Text);
{ You must make sure you call this method *before* sending the stream }
MultiPartFormDataStream.PrepareStreamForDispatch;
MultiPartFormDataStream.Position := 0;
//调用idhttp的post方法,第一个参数是用于处理上载form的asp/php等等脚本,第三个是接收脚本执行完成后的返回内容)
IdHTTP1.Post("http://xxx.xxx.com/upload.asp", MultiPartFormDataStream, ResponseStream);
finally
MultiPartFormDataStream.Free;
ResponseStream.Free;
end;
end;
从这些代码可以引出很多应用:
1。asp里调用其它脚本语言如(php,jsp,等等)。把这段代码用组件实现,在asp中调用,就可以 了。
2。从普通的应用程序调用asp,php等等脚本
3。传统的html中,必须在浏览器中选择文件,才能上载(号称是为了安全),通过这个就可以实现
不通过选择文件,实现上载。 

Delphi调用Http接口上传文件

SS := TStringStream.Create('', TEncoding.UTF8); HttpClient := TIdHttp.Create(); MutPartForm ...
  • zjm12343
  • zjm12343
  • 2015年12月12日 13:56
  • 3401

通过 http 协议上传文件

1、概述 在最初的 http 协议中,没有上传文件方面的功能。 rfc1867 (http://www.ietf.org/rfc/rfc1867.txt) 为 http 协议添加了这个功能。客户端的...
  • bestlove12345
  • bestlove12345
  • 2016年07月04日 10:47
  • 1218

如何使用idhttp上传文件

标题: 如何使用idhttp上传文件 关键字: 如何使用idhttp上传文件 分类: 个人专区 密级: 公开 (评分: , 回复: 0, 阅读: 22) »» ...
  • chinajobs
  • chinajobs
  • 2016年05月18日 10:58
  • 534

Delphi 大文件传输源码

  • 2010年04月04日 21:55
  • 411KB
  • 下载

delphiPOST使用IDHTTP,POST数据到WEB服务器的例子

  • 2011年10月29日 01:23
  • 232KB
  • 下载

用Delphi开发FTP上传文件的原代

首先确保你的FTP开通成功程序大致代码如下:with IdFtp1 do begin  if connected then quit;  user := 你的登录名;  password := 登录密...
  • xwchen
  • xwchen
  • 2007年10月24日 14:57
  • 5535

IdHTTPServer1 收到POST 文件和参数

使用INDY 10 ,不然有些单元可能无法找到编译。 目前发现的问题有:对于#$0A 会自动转变成 #$0D#$0A,在传输文件时最好是进行编码传输。网上搜索这类信息很少,好像是Decoder.Re...
  • gj333
  • gj333
  • 2016年05月14日 09:35
  • 2985

delphi 中 使用 TIdHTTP 提交Post数据

var fhttpRequest: TIdHTTP; PostData : TStringStream; tmpStr : String; begin fhttpRequest := TIdHT...
  • webouse
  • webouse
  • 2017年04月07日 09:52
  • 2898

delphi 上传文件至web服务器

  • 2009年02月22日 20:11
  • 232KB
  • 下载

转:delphi 实现文件上传下载

unit UpDownFile;interfaceuses    Windows, Classes, Idhttp, URLMon, IdMultipartFormData;const UpUrl =...
  • leihentulong
  • leihentulong
  • 2007年04月01日 23:38
  • 1229
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:delphi中通过TIdhttp控件上载文件
举报原因:
原因补充:

(最多只允许输入30个字)