高分求http上传文件的办法,希望大家说的详细点,并能很有耐心的帮我解决这个问题,其实这个问题不难,我也找了很多资料,下了很多代码,可是用他们的办法,老是程序出错,要么返回http/1.1 400的错误,要么返回http/1.1 404的错误。谢谢大家先。

解决方案 »

  1.   

    看了些资料,有两种办法,一种是直接用idhttp就可以把文件post到服务器上,一种是服务端要有个asp,用来接收,可是我两种试过都不行。
    其实我的要求很简单,就是把本地的文件(比如:c:\ccc.txt)上传到服务器上,我iis都已经装了,是不是装完iis后,还学要在服务端设置一下才行?
      

  2.   

    可以用idhttp+asp上传到数据库,你首先要检查ASP上传数据是否正确,如果ASP添加数据没有问题,http可以直接post经ASP文件到数据库
      

  3.   

    网上下的例子里,一般都带有一个delphi程序和一个html文件和一个asp文件,通过html文件上传好像就不行了。
      

  4.   

    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页面也没有直接对应的办法。
      

  5.   

    楼上的,谢谢先,你说的能不能结合一些代码?
    我从网上找的资料里,有个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的错误。
      

  6.   

    不好意思,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 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>
      

  7.   

    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.
      

  8.   

    myy(),能提供我rcv.asp的代码吗?谢谢。
      

  9.   

    我不会ASP,只会JSP,但原理都是一样的。在网上找个“能接受普通html上传文件的asp”应该不难吧?
      

  10.   

    我Indy用9.00.18版的,可是没有找到TIdMultiPartFormDataStream这个控件啊,而且用你的程序带进去,提示TIdMultiPartFormDataStream错误,错误提示也是说没有这个控件。
      

  11.   

    不是面板上的控件,是个类,自己在 use 中加 :IdMultipartFormData
      

  12.   

    也把我在服务端接收的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 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