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中,必须在浏览器中选择文件,才能上载(号称是为了安全),通过这个就可以实现
不通过选择文件,实现上载。 
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Android通过ftp上传、下载文件

在开发中有可能会遇到通过ftp协议来上传和下载文件,网上也有很多的帖子,但大部分都没什么用,通过参考其他和自己思考写了两个经测试可用的方法,这两个方法需要一个commons-net-3.x的jar包,...

文件的上传与下载

前言:我们经常使用的云盘,就是利用文件的上传下载技术,大大方便了我们的生活,而且在网站注册或考试报名时,也使用了上传下载技术,例如上传照片等。 1、文件上传对表单的要求   ● 必...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Delphi xe5 控件TIdhttp的用法post,get解决中文乱码问题

网络接口如下图: 浏览器演示如下:http://112.64.158.30:7777/web/login!doLogin?data={"password":"yangtao123","userCo...

C#通过文件流下载文件

1、该方法传入的参数为需要下载的文件(需要包含绝对路径)/// /// 通过文件流下载文件 /// /// 文件名称(包含目录和后缀名) ...

通过 HttpClient 下载 文件

使用HttpClient下载文件主要还是文件流的转化的东西比较烦一点。httpclient的东西比较简单的 引用 需要有的Jar;     * commons-httpclient-3...

通过HttpClient上传文件

前几天做一个功能的时候发现了一个很诡异的问题,刚开始通过okhttp上传文件,发现上传到服务端的文字描述是乱码,我猜是编码问题,所以把编码设为UTF-8后还是这样的问题,从服务端得知我的编码一直是IO...

通过WebService上传文件

昨天弄了一天的文件流,哎,现在还有点迷糊 实现WinForm客户端通过WebService上传文件: 思路是从本地读取一个文件的,得到这个文件的字节数组,然后把字节数组传给到Web Service...

DELPHI 通过ZLib来压缩文件夹

unit Unit1; interface uses   ZLib,   Windows, Messages, SysUtils, Variants, Classes, Graphics, C...

[delphi]利用TidHTTP控件向目标PHP网页POST参数

最近在做一个功能(delphi),需要向163邮箱发送EMAIL,本想偷懒利用现成的Indy的smtp控件发送,结果发现163邮箱已对这类发送方式纳入垃圾邮件了......

java通过ftp上传、下载文件,遍历文件目录

import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io....
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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