重拾cgi——文件上传和cgicc

html中上传文件,只需要表单里面放一个input type=file即可,如果要使用ajax异步上传(下文基于jquery),就需要注意几点(以下操作,部分需要基于html5定义的api):

1、页面上创建一个input元素,type是file。如果一个input需要支持选择多个文件,在标签中增加属性:multiple=”multiple”。(注意,这需要浏览器支持html5,具体文档可以见)

2、获取这个元素绑定的已上传文件
[cce lang=”javascript”]
var files = document.getElementById(‘xxx’).files;
[/cce]
先获取元素,通过读取元素的files属性,获取所有已经选择的文件。

3、组装formdata,因为上传文件可能会比较大,所以即使支持多选文件,这里还是分成不同的请求发送。
[cce lang=”javascript”]
for(var i=0;i<array.length;i++) {
var file = files[index];
var formData = new FormData();
formData.append("file", file);
formData.append("id", i+1);
}
[/cce]
这里将每个文件单独组装成一个formdata,里面包含文件内容和一个id。

4、通过jquery发起post请求:
[cce lang=”javascript”]
$.ajax({
type: 'POST',
url: "file/new",
data: formData,
async: true,
cache: false,
processData: false,
contentType: false,
xhr: function() {
myXhr = $.ajaxSettings.xhr();
if(myXhr.upload){
myXhr.upload.addEventListener('progress',progressHandlerFunction, false);
}
return myXhr;
},
success: function(data){
if(!data.result) {
progressTag.remove();
$("#" + index).after($('<span style="color:red">'+data.msg+'</span>'));
}
}
});
[/cce]
其中的xhr部分稍后会提到,这里还有两个需要特别注意的地方。首先是processData属性,必须设置为false,其次是contentType必须设置为false。其他后端不清楚,cgicc在处理文件上传(既multipart方式post的时候),必须从http头中读取Content-Disposition属性,只有在jquery里面设置了前面提到的两个属性,才能正确的按照标准协议进行封装,让cgicc读取到正确的内容分隔字符串。

5、锦上添花,增加进度条
[cce lang=”javascript”]
var progressTag = $("<progress/>", {
value: 0,
min: 0,
max: file.size
});
$("#" + index).after(progressTag);

function progressHandlerFunction(evt) {
if (evt.lengthComputable) {
progressTag.attr("max", evt.total);
progressTag.attr("value", evt.loaded);
}
}
[/cce]
这里通过jquery动态的增加了一个progress标签(html5中新增),然后定义了一个handler。之前jquery的ajax函数中看见了,通过获取原生xhr对象,在upload事件上增加handler函数回调,在上传的同时,将具体进度反馈给用户。当然,如果需要,这里也可以绑定download事件。

6、cgicc处理文件
cgicc处理文件和普通表单元素类似,唯一的区别是需要通过cgi.getFile函数来获取,而不是cgi.getElement。
[cce lang=”cpp”]
cgicc::form_iterator idIter = cgi.getElement("id");
cgicc::file_iterator fileIter = cgi.getFile("file");
if(idIter == cgi.getElements().end())
{
//handle error
}
int id = (int)idIter->getIntegerValue();

if(fileIter == cgi.getFiles().end())
{
//handle error
}
std::ofstream of(boost::lexical_cast<std::string>(id));
fileIter->writeToStream(of);
[/cce]
这里忽略了错误处理,通过获取表单元素,作为文件名,直接将文件通过标准库文件输出流ofstream写到磁盘上。

这样,就完成了从页面上选择文件,到后台保存的简单流程。

时间: 2024-08-02 18:22:05

重拾cgi——文件上传和cgicc的相关文章

jsp上传文件 文件上传后怎样才能自动重命名。

问题描述 现在的代码如果上传文件重名会覆盖原有文件,应该怎么写才能让文件上传时自动按上传时间重命名???@RequestMapping("/addversion.action")publicModelAndViewaddVersion(StringjsonString,HttpServletRequestrequest,HttpServletResponseresponse,@RequestParamMultipartFile[]myfiles){StringrealPath=&quo

明日网全功能超级文件上传管理系统 V1.0 源码发布

上传 下载地址: http://www.xingworld.net/download/source/asp/20026563121_44517.zip 详细说明: http://www.xingworld.net/show.asp?root=1&branch=1&leaf=4&id=1101 =============================================================== 明日网文件上传管理系统 V1.0 版权所有: 明日网站(Xing

JavaBean实现多文件上传的两种方法

上传 摘要:本文介绍了JavaBean实现多个文件上传的两种方法,分别是使用http协议和ftp协议实现.首先讲述了http协议传送多个文件的基本格式和实现上传的详细过程,之后简单介绍了使用ftpclient 类实现了ftp方式的上传,最后对这两种方法进行了比较. 关键字:JavaBean .http .ftp .ftpclient JavaBean是一种基于Java的软件组件.JSP对于在Web 应用中集成JavaBean组件提供了完善的支持.这种支持不仅能缩短开发时间(可以直接利用经测试和可

php文件上传

文件上传一般有下面2种方式: 有两种: 1.标准input表单方式,典型的用$_FILES进行接收: 2.以Base64的方式进行传送,一般是AJAX异步上传. 第一种 标准的input表单方式,适用于大文件进行上传,同时支持批量.html代码关键的几句: <form enctype="multipart/form-data" method="post" action="upload.php""> <input typ

PHP中codeigniter文件上传类代码实例

  codeigniter文件上传类代码实例 文件上传类 CodeIgniter 的文件上传类允许文件被上传.您可以设置指定上传某类型的文件及指定大小的文件. 处理过程 上传文件普遍的过程: 一个上传文件用的表单,允许用户选择一个文件并上传它. 当这个表单被提交,该文件被上传到指定的目录. 同时,该文件将被验证是否符合您设定的要求. 一旦文件上传成功,还要返回一个上传成功的确认窗口. 这里有一个简短的教程来显示这个过程.此后你将会找到相关的参考信息. 创建上传表单 运用文本编辑器创建一个名为up

用PHP实现文件上传二法

上传 PHP(Hypertext Preprocessor)是一种 HTML 内嵌式的语言 (类似 IIS 上的ASP).而 PHP 独特的语法混合了 C.Java.Perl 以及 PHP 式的新语法.它可以比 CGI 或者 Perl 更快速的执行动态网页.除此之外,用 PHP 写出来的 Web 后端CGI 程序,可以很轻易的移植到不同的系统平台上. 我们在做网站时,需要访问者的参于才能将网站建设得更加引人注目,这就要求我们从访问者那里得到文章.图片等.因此,文件上传成为网页中必不可少的功能.现

图片及文件上传和下载

上传|下载 本文简单介绍ASP.NET 2.0中将图片或文件上传到服务器或保存到数据库的方法,以及保存后如何显示和下载.1.图片及文件保存到服务器1.1 上传本示例构造一个能将文件上传到服务器指定目录的页面.(1)       新建一个ASP.NET网站,增加web.config配置文件.(2)       在解决方案资源管理器中,在网站名称上单击鼠标右键,增加一个文件夹,取名为Images,作为上传文件的路径.(3)       进入default.aspx的设计模式,从工具箱的标准选项卡中,

PHP多文件上传操作

    其实多文件上传和单文件上传大同小异,原理都是一样的,只是在代码上做了点小技巧.       首先还是index.html上传表单,只是把之前上传文件表单里的file更改成了file[]   复制代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <

如何用PHP实现文件上传例子

上传                 如何用PHP实现文件上传(实例1) 上载文件表单网页:updatefile.htm<html><head><title>上载文件表单</title></head><body><form ENCTYPE="multipart/form-data" ACTION="updatefile.php3" METHOD="POST">&l