200分求idhttp上传文件的方法。 高分求http上传文件的办法,希望大家说的详细点,并能很有耐心的帮我解决这个问题,其实这个问题不难,我也找了很多资料,下了很多代码,可是用他们的办法,老是程序出错,要么返回http/1.1 400的错误,要么返回http/1.1 404的错误。谢谢大家先。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看了些资料,有两种办法,一种是直接用idhttp就可以把文件post到服务器上,一种是服务端要有个asp,用来接收,可是我两种试过都不行。其实我的要求很简单,就是把本地的文件(比如:c:\ccc.txt)上传到服务器上,我iis都已经装了,是不是装完iis后,还学要在服务端设置一下才行? 可以用idhttp+asp上传到数据库,你首先要检查ASP上传数据是否正确,如果ASP添加数据没有问题,http可以直接post经ASP文件到数据库 网上下的例子里,一般都带有一个delphi程序和一个html文件和一个asp文件,通过html文件上传好像就不行了。 idhttp配合idMutilPartFormData就可以上传文件,但前提是服务端要有个asp(或jsp),用来接收,这个asp(或jsp)必须能解析multipart/form-data类型的上传数据。举个例子:<form method="POST" ENCTYPE="multipart/form-data" action="rcv.asp"> <input name="a" type="file" /></form>这个表单在snd.htm文件中,提交目标是rcv.asp,如果rcv.asp能解析提交的数据,分解出文件来,那么就可以用 idhttp + idMutilPartFormData 模拟snd.htm,通过rcv.asp进行文件上传。直接用idhttp就可以把文件post到服务器上也要有asp(或jsp)接收才行,但不常用,这时候接收的asp不用解析数据流,因为收到的全部数据就是文件的内容,直接保存就行了。缺点是无法一次上传多个文件,如果用html页面也没有直接对应的办法。 楼上的,谢谢先,你说的能不能结合一些代码?我从网上找的资料里,有个asp接收的,代码如下:<%'建立对象 Set upfile = Server.CreateObject("myobj.upfile")'获得表单对象response.write upfile.form("a1")&"<br>"response.write upfile.form("a2")&"<br>"response.write upfile.form("a3")&"<br>"response.write upfile.form("a4")&"<br>"response.write upfile.form("a5")&"<br>"response.write upfile.form("a6")&"<br>"'获得文件大小response.write "文件字节数:"&upfile.filesize&"<br>"'获得文件类型response.write "文件类型:"&upfile.filetype&"<br>"'获得文件名,保存文件upfile.filesaveas("d:\"+upfile.filename)set upfile = nothing%>delphi中上传的代码:procedure TForm1.SendPostData(filename:string); Const CRLF = #13#10; var Source: TMemoryStream; Source1: TMemoryStream; Response: TStringStream; S,s1: String;begin Screen.Cursor := crHourGlass; try memoHTML.Clear; HTTP.Request.Username := ''; HTTP.Request.Password := ''; HTTP.Request.ProxyServer := ''; HTTP.Request.ProxyPort := 80; HTTP.Request.ContentType := 'multipart/form-data'; HTTP.Intercept := LogDebug; HTTP.InterceptEnabled := true; Response := TStringStream.Create(''); try S := '-----------------------------7cf1d6c47c' + CRLF + 'Content-Disposition: form-data; name="file1"; filename="'+filename+'"'+CRLF + 'Content-Type: application/octet-stream' + CRLF + CRLF; //上传文件内容 s1:='file one content. Contant-Type can be application/octet-stream or if'+ 'you want you can ask your OS fot the exact type.' + CRLF + '-----------------------------7cf1d6c47c' + CRLF + //分界符,用于分隔表单(Form)中的各个域 'Content-Disposition: form-data; name="text1"' + CRLF + CRLF + 'hello2' + CRLF + '-----------------------------7cf1d6c47c--'; //提交的下一个表单内容域的内容 s1:=CRLF +'-----------------------------7cf1d6c47c' + CRLF + 'Content-Disposition: form-data; name="text1"' + CRLF + CRLF + 'hello2' + CRLF + '-----------------------------7cf1d6c47c--'; Source := TMemoryStream.Create; Source1 := TMemoryStream.Create; Source1.LoadFromFile(filename); Response:=TStringStream.Create('') ; Response.CopyFrom(source1,source1.Size); s:=s+Response.DataString;//因为只能传字符串 Source.Position :=0; Source.Write(s[1],length(s)); Source.Position :=source.Size ; Source.Write(s1[1],length(s1)); Response.Position :=0; try HTTP.Post(cbURL.Text, Source, Response); finally Source.Free; end; memoHTML.Lines.Text := Response.DataString; finally Response.Free; end; finally Screen.Cursor := crDefault; end;end;可是我运行后却返回http\1.1 400或者404的错误。 不好意思,asp接收的代码发错了,新的如下:<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="GENERATOR" content="Microsoft FrontPage 4.0"><meta name="ProgId" content="FrontPage.Editor.Document"><title>用Delphi写ASP组件实现快速多文件WEB上传演示</title></head><body><p align="center">用Delphi写ASP组件实现快速多文件WEB上传演示</p><%dim obdim fsizeset ob=server.createobject("ASPComponent.CoIFileUpload")path=server.mappath(".")fsize=ob.savefile(path,true)response.write "<br>文本框值:" & ob.request("text1")response.write "<br>文本域值:" & ob.request("textarea1")response.write "<br>编码数据大小: " & fsize response.write "<br>文件保存路径: " & pathresponse.write "<br>文件1: 文件名:" & ob.Request("file1") & ", 文件类型:" & ob.FileType("file1") & ", 文件大小:" & ob.FileSize("file1") response.write "<br>文件1: 文件名:" & ob.Request("file2") & ", 文件类型:" & ob.FileType("file2") & ", 文件大小:" & ob.FileSize("file2") %></body></html> idhttp + idMutilPartFormData 十分简单,例子:...var res : String; mps : TIdMultiPartFormDataStream;begin try mps := TIdMultiPartFormDataStream.Create; msp.AddFile('File1','c:\test1.zip',''); msp.AddFile('File2','c:\test2.zip',''); res:=idhttp1.Post('http://xxxx/rcv.asp',mps); ... finally mps.Free; end;end;...注意:Indy最好用比较新的版本如 9.00.18或10.xxxxx,旧版本的idMutilPartFormData.pas有一些bug. myy(),能提供我rcv.asp的代码吗?谢谢。 我不会ASP,只会JSP,但原理都是一样的。在网上找个“能接受普通html上传文件的asp”应该不难吧? 我Indy用9.00.18版的,可是没有找到TIdMultiPartFormDataStream这个控件啊,而且用你的程序带进去,提示TIdMultiPartFormDataStream错误,错误提示也是说没有这个控件。 不是面板上的控件,是个类,自己在 use 中加 :IdMultipartFormData 也把我在服务端接收的rcv.asp代码也写出来,以后有人喷到相关问题,也好解决。<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="GENERATOR" content="Microsoft FrontPage 4.0"><meta name="ProgId" content="FrontPage.Editor.Document"><title>用Delphi写ASP组件实现快速多文件WEB上传演示</title></head><body><p align="center">用Delphi写ASP组件实现快速多文件WEB上传演示</p><%dim obdim fsizeset ob=server.createobject("ASPComponent.CoIFileUpload")path=server.mappath(".")fsize=ob.savefile(path,true)response.write "<br>文本框值:" & ob.request("text1")response.write "<br>文本域值:" & ob.request("textarea1")response.write "<br>编码数据大小: " & fsize response.write "<br>文件保存路径: " & pathresponse.write "<br>文件1: 文件名:" & ob.Request("file1") & ", 文件类型:" & ob.FileType("file1") & ", 文件大小:" & ob.FileSize("file1") response.write "<br>文件1: 文件名:" & ob.Request("file2") & ", 文件类型:" & ob.FileType("file2") & ", 文件大小:" & ob.FileSize("file2") %></body></html>myy()到这里领分,顺便看看如何改上传文件名的问题。http://community.csdn.net/Expert/topic/4315/4315830.xml?temp=.8935358 有偿寻复杂报表解决方案!请加我的QQ。待遇面淡 FastReport DetailData中不符合条件的不显示不打印 怎样通过一个指针,把这个指针所指向的内存存为一个array of byte? 儿子出世,散分庆祝。 RPC服务器不可用,可能是什么原因? 下载的书看不了,真头痛。请问超星3.72版的注册码是什么? 连adoconnection dbgrid如何用非表字段来记录一些数值 请问怎样将“消息框”中按钮上显示的字改成“确定”? 如何在开发过程中控制delphi窗口的弹出效果。 谁用过MMCExpert,请给予指点。。 看看我下面的句子错哪了?
其实我的要求很简单,就是把本地的文件(比如:c:\ccc.txt)上传到服务器上,我iis都已经装了,是不是装完iis后,还学要在服务端设置一下才行?
这个asp(或jsp)必须能解析multipart/form-data类型的上传数据。举个例子:<form method="POST" ENCTYPE="multipart/form-data" action="rcv.asp">
<input name="a" type="file" />
</form>这个表单在snd.htm文件中,提交目标是rcv.asp,如果rcv.asp能解析提交的数据,
分解出文件来,那么就可以用 idhttp + idMutilPartFormData 模拟snd.htm,
通过rcv.asp进行文件上传。
直接用idhttp就可以把文件post到服务器上也要有asp(或jsp)接收才行,但不常用,
这时候接收的asp不用解析数据流,因为收到的全部数据就是文件的内容,直接保存就行了。
缺点是无法一次上传多个文件,如果用html页面也没有直接对应的办法。
我从网上找的资料里,有个asp接收的,代码如下:
<%'建立对象
Set upfile = Server.CreateObject("myobj.upfile")'获得表单对象
response.write upfile.form("a1")&"<br>"
response.write upfile.form("a2")&"<br>"
response.write upfile.form("a3")&"<br>"
response.write upfile.form("a4")&"<br>"
response.write upfile.form("a5")&"<br>"
response.write upfile.form("a6")&"<br>"'获得文件大小
response.write "文件字节数:"&upfile.filesize&"<br>"
'获得文件类型
response.write "文件类型:"&upfile.filetype&"<br>"'获得文件名,保存文件
upfile.filesaveas("d:\"+upfile.filename)set upfile = nothing
%>
delphi中上传的代码:
procedure TForm1.SendPostData(filename:string);
Const
CRLF = #13#10;
var
Source: TMemoryStream;
Source1: TMemoryStream;
Response: TStringStream;
S,s1: String;
begin
Screen.Cursor := crHourGlass;
try
memoHTML.Clear;
HTTP.Request.Username := '';
HTTP.Request.Password := '';
HTTP.Request.ProxyServer := '';
HTTP.Request.ProxyPort := 80;
HTTP.Request.ContentType := 'multipart/form-data';
HTTP.Intercept := LogDebug;
HTTP.InterceptEnabled := true; Response := TStringStream.Create('');
try S := '-----------------------------7cf1d6c47c' + CRLF +
'Content-Disposition: form-data; name="file1"; filename="'+filename+'"'+CRLF +
'Content-Type: application/octet-stream' + CRLF + CRLF; //上传文件内容
s1:='file one content. Contant-Type can be application/octet-stream or if'+
'you want you can ask your OS fot the exact type.' + CRLF +
'-----------------------------7cf1d6c47c' + CRLF + //分界符,用于分隔表单(Form)中的各个域
'Content-Disposition: form-data; name="text1"' + CRLF + CRLF +
'hello2' + CRLF +
'-----------------------------7cf1d6c47c--'; //提交的下一个表单内容域的内容
s1:=CRLF +'-----------------------------7cf1d6c47c' + CRLF +
'Content-Disposition: form-data; name="text1"' + CRLF + CRLF +
'hello2' + CRLF +
'-----------------------------7cf1d6c47c--'; Source := TMemoryStream.Create;
Source1 := TMemoryStream.Create;
Source1.LoadFromFile(filename);
Response:=TStringStream.Create('') ;
Response.CopyFrom(source1,source1.Size); s:=s+Response.DataString;//因为只能传字符串
Source.Position :=0;
Source.Write(s[1],length(s));
Source.Position :=source.Size ;
Source.Write(s1[1],length(s1));
Response.Position :=0;
try
HTTP.Post(cbURL.Text, Source, Response);
finally
Source.Free;
end;
memoHTML.Lines.Text := Response.DataString;
finally
Response.Free;
end;
finally
Screen.Cursor := crDefault;
end;end;
可是我运行后却返回http\1.1 400或者404的错误。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>用Delphi写ASP组件实现快速多文件WEB上传演示</title>
</head>
<body>
<p align="center">用Delphi写ASP组件实现快速多文件WEB上传演示</p>
<%
dim ob
dim fsize
set ob=server.createobject("ASPComponent.CoIFileUpload")
path=server.mappath(".")
fsize=ob.savefile(path,true)
response.write "<br>文本框值:" & ob.request("text1")
response.write "<br>文本域值:" & ob.request("textarea1")
response.write "<br>编码数据大小: " & fsize
response.write "<br>文件保存路径: " & path
response.write "<br>文件1: 文件名:" & ob.Request("file1") & ", 文件类型:" & ob.FileType("file1") & ", 文件大小:" & ob.FileSize("file1")
response.write "<br>文件1: 文件名:" & ob.Request("file2") & ", 文件类型:" & ob.FileType("file2") & ", 文件大小:" & ob.FileSize("file2")
%></body>
</html>
var
res : String;
mps : TIdMultiPartFormDataStream;
begin
try
mps := TIdMultiPartFormDataStream.Create;
msp.AddFile('File1','c:\test1.zip','');
msp.AddFile('File2','c:\test2.zip','');
res:=idhttp1.Post('http://xxxx/rcv.asp',mps);
...
finally
mps.Free;
end;
end;
...注意:Indy最好用比较新的版本如 9.00.18或10.xxxxx,
旧版本的idMutilPartFormData.pas有一些bug.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>用Delphi写ASP组件实现快速多文件WEB上传演示</title>
</head>
<body>
<p align="center">用Delphi写ASP组件实现快速多文件WEB上传演示</p>
<%
dim ob
dim fsize
set ob=server.createobject("ASPComponent.CoIFileUpload")
path=server.mappath(".")
fsize=ob.savefile(path,true)
response.write "<br>文本框值:" & ob.request("text1")
response.write "<br>文本域值:" & ob.request("textarea1")
response.write "<br>编码数据大小: " & fsize
response.write "<br>文件保存路径: " & path
response.write "<br>文件1: 文件名:" & ob.Request("file1") & ", 文件类型:" & ob.FileType("file1") & ", 文件大小:" & ob.FileSize("file1")
response.write "<br>文件1: 文件名:" & ob.Request("file2") & ", 文件类型:" & ob.FileType("file2") & ", 文件大小:" & ob.FileSize("file2")
%></body>
</html>
myy()到这里领分,顺便看看如何改上传文件名的问题。
http://community.csdn.net/Expert/topic/4315/4315830.xml?temp=.8935358