登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: [indy/post/HTTPEncode()] indy 控件 TIdHTTP 提交特殊字符的 bug     [回主站]     [分站链接]
标题
[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"用于表单里有图片上传。


表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码。
如下:

上传企业营业执照图片:


就得加ENCTYPE="multipart/form-data"。


表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.
enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去。
form里面的input的值以2进制的方式传过去,所以request就得不到值了。 也就是说加了这段代码,用request就会传递不成功,取表单值加入数据库时,用到下面的:

SmartUpload su = new SmartUpload();//新建一个SmartUpload对象

su.getRequest().getParameterValues();取数组值

su.getRequest().getParameter( );取单个参数单个值
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); // 读取服务器响应:


总数:3 页次:1/1 首页 尾页  
总数:3 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1