标题
    
    
        [indy/post/HTTPEncode()] indy 控件 TIdHTTP 提交特殊字符的 bug
    
 
    
 	 
       
    
    clq
    
    
    
		
        浏览(2) + 
        2008-11-20 15:31:35 发表
        
编辑
         
        
        
        
        关键字: 
        
 
        
        
        
        
                
        [indy/post/HTTPEncode()] indy 控件 TIdHTTP 提交特殊字符的 bug
tidhttp 中的 HTTPOptions 为 TIdHTTPOption = (hoInProcessAuth, hoKeepOrigProtocol, hoForceEncodeParams); 默认含有 hoForceEncodeParams 这会使 post 过去中的每一行都执行 TIdURI.ParamsEncode() 进行 http 编码,但这个函数有个 bug 它没有处理 [&] 符号,所以会导致上传时在 [&] 符号时被截断.
一个正确的替换方法是将 hoForceEncodeParams 属性去掉,然后对参数用 delphi 自带的 HTTPEncode()  函数进行编码.
例如下例:
var
  http:TIdHTTP;
  sl:TStringlist;
  
begin
  try
  //发送到聊天记录服务器上
  sl:=TStringlist.Create;
  sl.Values['im_user_name'] := user;//MainSession.Jid;
  sl.Values['peer'] := peer;
  sl.Values['message'] := HTTPEncode(msg);
  sl.Values['say_time'] := say_time;
  sl.Values['speaker'] := speaker;
  sl.Values['action'] := 'new';
  http := TIdHTTP.Create(application);
  http.HTTPOptions := [];
  http.Post('http://127.0.0.1:8080/imp/im_record.jsp', sl);
  sl.Free;
  md.Free;
  http.free;
  except
  end;
end;
另外 jsp 目前仍然是不能接受 TIdMultiPartFormDataStream 传递的参数的,要使用第三方接收文件的那种控件才行.
        
        
        
        		
		        
                
                
     
    
 
	
	
     
    
       
    
    clq
    
    
    
    
    2008-11-20 16:06:16 发表
    
编辑
     
    
    		    
    
          
              
    	对于网页就是 form 的类型为 [enctype="multipart/form-data"] 这个时候要用 cos 组件来接收.
"
JSP上传组件cos
cos上传组件它是著名O'Reilly的图书出版公司开发的。这个上传的组件做得很棒。
 主页 http://www.servlets.com/cos/index.html
"
    
    
     
 
	 
    
       
    
    clq
    
    
    
    
    2008-11-20 16:06:45 发表
    
编辑
     
    
    
    
          
              
    	jsp中form 中Enctype=multipart/form-data 的作用
新一篇: 利用Apache的FileUpload类库实现文件上传 | 旧一篇: 有关xml中的xmlns
ENCTYPE="multipart/form-data"用于表单里有图片上传。
    
     
 
	 
    
       
    
    clq
    
    
    
    
    2008-11-20 16:09:28 发表
    
编辑
     
    
    
    
          
              
    	multipart/form-data编码的POST请求格式与application/x-www-form-urlencoded完全不同
--------------------------------------------------
C#模拟提交表单 post-带附件的表单普通的模拟提交表单的操作只要构建html协议中的数据就行,但是表单中如果含有file的话, 也就是说含有附件上传的内容的话怎样提交呢? 使用multipart/form-data发送文件  如果要在客户端向服务器上传文件,我们就必须模拟一个POST multipart/form-data类型的请求,Content-Type必须是multipart/form-data。  以multipart/form-data编码的POST请求格式与application/x-www-form-urlencoded完全不同,multipart/form-data需要首先在HTTP请求头设置一个分隔符,例如ABCD:  我们模拟的提交要设定 content-type不同于非含附件的post时候的content-type,这里需要: ("Content-Type", "multipart/form-data; boundary=ABCD");   然后,将每个字段用“--分隔符”分隔,最后一个“--分隔符--”表示结束。例如,要上传一个title字段"Today"和一个文件C:\1.txt,HTTP正文如下: --ABCD Content-Disposition: form-data; name="title" \r\n Today --ABCD Content-Disposition: form-data; name="1.txt"; filename="C:\1.txt" Content-Type: text/plain \r\n <这里是1.txt文件的内容> --ABCD-- \r\n   请注意,每一行都必须以\r\n结束,包括最后一行。 如果用Sniffer程序检测IE发送的POST请求,可以发现IE的分隔符类似于——7d4a6d158c9,这是IE产生的一个随机数,目的是防止上传文件中出现分隔符导致服务器无法正确识别文件起始位置。我们可以写一个固定的分隔符,只要足够复杂即可。下面是一段java的post 带附件的模拟发送程序段:   发送文件的POST代码如下: String[] props = ... // 字段名 String[] values = ... // 字段值 byte[] file = ... // 文件内容 String BOUNDARY = "---------------------------7d4a6d158c9"; // 分隔符 StringBuffer sb = new StringBuffer();// 发送每个字段 :for(int i=0; i sb = sb.append("--"); sb = sb.append(BOUNDARY); sb = sb.append("\r\n"); sb = sb.append("Content-Disposition: form-data; name=\""+ props[i] + "\"\r\n\r\n"); sb = sb.append(URLEncoder.encode(values[i])); sb = sb.append("\r\n"); }// 发送文件:sb = sb.append("--"); sb = sb.append(BOUNDARY); sb = sb.append("\r\n"); sb = sb.append("Content-Disposition: form-data; name=\"1\"; filename=\"1.txt\"\r\n"); sb = sb.append("Content-Type: application/octet-stream\r\n\r\n"); byte[] data = sb.toString().getBytes(); byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();// 设置HTTP头: hc.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY); hc.setRequestProperty("Content-Length", String.valueOf(data.length + file.length + end_data.length)); // 输出:output = hc.openOutputStream();output.write(data);output.write(file);output.write(end_data); // 读取服务器响应:
    
    
     
 
	 
	
    NEWBT官方QQ群1: 276678893
    可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
    但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
    验证问题说明申请入群原因即可.