aJax文本中包含&符号上传错误的解决方法
来源:互联网 发布:编辑网页的软件 编辑:程序博客网 时间:2024/04/29 06:10
前几天写了个上传文本到服务器的网页,逻辑很简单,功能和paste.ubuntu.com差不多,主要是我平时上传代码使用,可以记录每一篇被阅读的次数。但是使用aJax上传的时候,却出了奇妙的问题,传文章之类的没有问题,但是传了个代码,却显示不完全。
经过我半天的找bug,终于发现,是上传的时候,上传的字符串被文本中的 & 符号错误的分割了,因为aJax的上传会构造这样的代码。
xmlhttp.send("poster="+poster+"&content="+content+"&title="+title);这样的话,一旦提交的文本中有 &,整个就会被错误的分割开,导致无法完整的传上去。我想了几种办法来解决,其中一种是想先进行base64转码,这样转码之后的字符串中就不会有 & 这类特殊符号了,而且字符串长度只会增长三分之一左右。但是Google了JavaScript的base64转码函数之后,却发现并不适用。那个函数只能对ASCII里的符号进行转码,一旦有中文就会转码失败。之后我又想起了当时做POJ镜像的时候看到的POJ的base64转码函数,结果虽然可以对中文进行转码了,但是 & 的问题却没有解决。
最后,我跑去问学长,学长从他的代码里找出了一个函数,可以将字符串进行URL转码。
encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。
这个函数可以将&这类的特殊符号转码为 %26 这样的十六进制数,在使用aJax进行提交之后,接收的PHP会自动将这些转码回原来的格式。这样,既不用担心正确性,也可以成功的将含有各种特殊字符的文本进行上传,最后为了安全,在PHP里将上传的文本再进行一次html转码,然后就可以存入数据库了。
全部的代码如下:
HTML:
<form action="/index/index/uptext.html" method="POST" id="pasteform" name="pasteform"><div align="center"><table><tr><th><label for="id_poster">Title:</label></th><td><input id="id_title" type="text" name="title" maxlength="30" /><br /></td></tr><tr><th><label for="id_poster">Poster:</label></th><td><input id="id_poster" type="text" name="poster" maxlength="30" /><br /></td></tr><tr><th><label for="id_content">Content:</label></th><td><textarea id="id_content" rows="20" cols="80" name="content"></textarea></td></tr><tr> <th> </th> <td> <button type="button" class="btn github" onclick="UpText()"/> Paste</td></tr></table></div></form>JavaScript:
function UpText(){var xmlhttp;if (window.XMLHttpRequest){xmlhttp = new XMLHttpRequest();}else{xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");}xmlhttp.onreadystatechange = function(){if (xmlhttp.readyState == 4 && xmlhttp.status == 200){document.getElementById("pasteform").innerHTML = xmlhttp.responseText;}}var poster = encodeURIComponent(document.getElementById("id_poster").value);var title = encodeURIComponent(document.getElementById("id_title").value);var content = encodeURIComponent(document.getElementById("id_content").value);xmlhttp.open("POST", "/index/index/uptext", true);xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");xmlhttp.send("poster="+poster+"&content="+content+"&title="+title);return false;}PHP(使用ThinkPHP5.0、Mongodb):
public function uptext(Request $request){$id = Db::name('public_text_id')->find();Db::name('public_text_id')->where('id', $id['id'])->update(['id' => $id['id']+1]);date_default_timezone_set("Asia/Shanghai");$_time = date("Y-m-d H:i:s");$_id = $id['id'] + 1;$_poster = htmlspecialchars(input('poster'));$_content = htmlspecialchars(input('content'));$_ip = $request->ip();$_title = htmlspecialchars(input('title'));Db::name('public_text')->insert(["id" => $_id, "poster" => $_poster, "title" => $_title, "content" => $_content, "ip" => $_ip, "time" => $_time, "loadcount" => 0]);$_return = 'Success!';return $_return;}
0 0
- aJax文本中包含&符号上传错误的解决方法
- PHP 字符串中包含$符号引起的典型错误
- Ajax中“Sys未定义”错误的解决方法
- ASP.NET中Ajax中“Sys未定义”错误的解决方法
- Ajax中“Sys未定义”错误的解决方法汇总
- SWFUPLOAD上传错误的解决方法
- C++中运用模版报“无法解析的外部符号”错误解决方法
- C#中错误:不包含适合于入 口点的静态“Main”方法 的解决方法
- Ajax Upload上传图片失败的解决方法:
- Ajax传递的数据包含特殊字符时的解决方法
- Vsftpd 不能上传文件的错误解决方法
- #define 定义的数据中包含有UL符号
- string.gsub参数中包含%符号的问题
- 怎么用OCR文字识别软件识别包含非常规符号的文本
- ofbiz——输入的文本包含大于(>)或小于(<)符号时会报错。
- LNK2001:无法解析的外部符号 错误常见解决方法
- Admob(6.12.x)符号未定义错误的解决方法(IOS)
- Admob(6.12.x)符号未定义错误的解决方法(IOS)
- MySQL使用的封装工具(Java)
- 大型网站架构系列:分布式消息队列(一)
- Javascript作用域链
- hbase的预分区
- 原型
- aJax文本中包含&符号上传错误的解决方法
- CSS - 05 背景,文本相关属性,内边距,外边距
- 矩阵的快速取幂法——求类Fibonacci数列(2)
- UINavigationController全屏右滑返回
- 第三十三天学习笔记
- redis SDS
- nginx通配符哈希表
- ZABBIX实践(二) centos下的Agent端部署和安装
- Linux软件包管理器及rpm命令总结