goahead文件下载
1. goahead下载文件源码
static char *websIndex; /* 默认页面名称 */
static char *websDocuments; /* 默认页面目录 */static void closeFile()
{wfree(websIndex); websIndex = NULL;wfree(websDocuments);websDocuments = NULL;
}
static void fileWriteEvent(Webs *wp)
{char *buf;ssize len, wrote;assert(wp);assert(websValid(wp));if ((buf = walloc(ME_GOAHEAD_LIMIT_BUFFER)) == NULL) {websError(wp, HTTP_CODE_INTERNAL_SERVER_ERROR, "Can't get memory");return;}while ((len = websPageReadData(wp, buf, ME_GOAHEAD_LIMIT_BUFFER)) > 0) {if ((wrote = websWriteSocket(wp, buf, len)) < 0) {break;}if (wrote != len) {websPageSeek(wp, - (len - wrote), SEEK_CUR);break;}}wfree(buf);if (len <= 0) {websDone(wp);}}static bool fileHandler(Webs *wp)
{WebsFileInfo info;char *tmp, *date;ssize nchars;int code;char *pathfilename; //带路径的文件名 用于找到对应的文件 char *filenameExt; //文件扩展名 用于 设置 MIME类型 char *filename; //文件名 用于下载后保存的文件名称 char *disposition; //临时保存 附件 标识 assert(websValid(wp));assert(wp->method);assert(wp->filename && wp->filename[0]); pathfilename = websGetVar(wp, "filePath", NULL);if (pathfilename==NULL)return 1;//取文件名和扩展名filename =sclone(getUrlLastSplit(sclone(pathfilename),"/"));filenameExt =sclone(getUrlLastSplit(sclone(filename),"."));if (wp->ext) wfree(wp->ext);wp->ext=walloc(1+strlen(filenameExt)+1);sprintf(wp->ext,".%s",sclone(filenameExt));free(filenameExt);filenameExt=NULL;if (wp->filename) wfree(wp->filename);wp->filename=sclone(pathfilename);if (wp->path) wfree(wp->path);wp->path=sclone(pathfilename);#if !BIT_ROMif (smatch(wp->method, "DELETE")) {if (unlink(wp->filename) < 0) {websError(wp, HTTP_CODE_NOT_FOUND, "Can't delete the URI");} else {/* No content */websResponse(wp, 204, 0);}} else if (smatch(wp->method, "PUT")) {websResponse(wp, wp->code, 0);} else #endif /* !BIT_ROM */{if (websPageIsDirectory(wp)) {nchars = strlen(wp->path);if (wp->path[nchars - 1] == '/' || wp->path[nchars - 1] == '\\') {wp->path[--nchars] = '\0';}tmp = sfmt("%s/%s", wp->path, websIndex);websRedirect(wp, tmp);wfree(tmp);return 1;}if (websPageOpen(wp, O_RDONLY | O_BINARY, 0666) < 0) {
#if BIT_DEBUGif (wp->referrer) {trace(1, "From %s", wp->referrer);}#endifwebsError(wp, HTTP_CODE_NOT_FOUND, "Cannot open document for: %s", wp->path);return 1;} if (websPageStat(wp, &info) < 0) {websError(wp, HTTP_CODE_NOT_FOUND, "Cannot stat page for URL");return 1;}code = 200;if (wp->since && info.mtime <= wp->since) {code = 304;}websSetStatus(wp, code);websWriteHeaders(wp, info.size, 0);disposition = walloc(20+strlen(filename)+1);//设置下载文件的名称sprintf(disposition,"attachment;filename=%s",sclone(filename));websWriteHeader(wp, "Content-Disposition", sclone(disposition));free(filename);free(disposition);filename=NULL;disposition=NULL; if ((date = websGetDateString(&info)) != NULL) {websWriteHeader(wp, "Last-modified", "%s", date);wfree(date);}websWriteEndHeaders(wp);/*All done if the browser did a HEAD request*/if (smatch(wp->method, "HEAD")) {websDone(wp);return 1;}websSetBackgroundWriter(wp, fileWriteEvent);}return 1;
}
/****goahead中的Action函数,前台可通过/action/downLoadFileAction访问*/
static void downLoadFileAction(Webs *wp, char *path,char*query){ //保存原来的回调函数 WebsHandlerProc service = (*wp).route->handler>service; //设置文件下载的handler函数(*wp).route->handler->service =(*fileHandler); (*wp).route->handler->service(wp); //恢复原来的回调函数(*wp).route->handler->service= service;
}
goahead文件下载相关推荐
- goahead实现文件下载功能实例详解
总体来说,goahead实现文件下载功能比较简单,基本上是调用固定的函数,但是也有一些坑,下面详细讲解我的实例记录. (1)定义下载的回调函数 websDefineAction("downl ...
- web server大全之GoAhead移植(转载)
转自:http://linux.chinaunix.net/techdoc/develop/2009/06/19/1119124.shtml 注:最近在做goAhead web server和移植其到 ...
- ini文件怎么使用_ftp文件下载工具,ftp文件下载工具是怎么使用的?使用指南
ftp文件下载工具是什么工具,可能有人会回答说不知道,因为一般只有从事网站管理的工作者会使用的多一点.但不是每个人生来就会的,所以刚开始肯定都会学习怎么使用.这篇文章就来教一下大家ftp文件下载工具是 ...
- 在ASP.NET中跟踪和恢复大文件下载
在Web应用程序中处理大文件下载的问题一直出了名的困难,因此对于大多数站点来说,如果用户的下载被中断了,它们只能说悲哀降临到用户的身上了.但是我们现在不必这样了,因为你可以使自己的ASP.NET应用程 ...
- Apache,Nginx,Lighttpd分别使用X-sendfile功能提升文件下载性能
关于mod_xsendfile https://tn123.org/mod_xsendfile/ Lighttpd中的X-sendfile RoR网站如何利用lighttpd的X-sendfile功能 ...
- java 文件下载 【学习记录】
工具类 public static Boolean downloadExcelFile(HttpServletResponse response, String fileName) {OutputSt ...
- python写一个文件下载器_Python3使用TCP编写一个简易的文件下载器
原标题:Python3使用TCP编写一个简易的文件下载器 利用Python3来实现TCP协议,和UDP类似.UDP应用于及时通信,而TCP协议用来传送文件.命令等操作,因为这些数据不允许丢失,否则会造 ...
- node简单实现excel文件下载
1.利用csv格式兼容实现 csv是一种利用','.'\t'.'\n'等分隔符存储的文本文件,excel可兼容打开,利用此原理,代码实现如下: app.use(route.get('/export', ...
- java ftp下载文件源码_java实现ftp文件下载的源代码
这几天做的一个项目中用到了ftp文件传输,用java实现了ftp文件的下载. 一.win7下搭建ftp服务器 详见:http://jingyan.baidu.com/article/4b52d7026 ...
- 使用C++基于Socket编程实现文件下载(改进-封装成类)
使用: (1)首先运行服务端,待服务端运行起来: (2)最后运行客户端,输入要传输文件到哪个目标机器的IP地址: (3)输入传输文件的路径及文件(完成的路径),其中包含文件的类型,也就是后缀需要包含( ...
最新文章
- 6个2教你认识递归的力量!
- PyQt:成功解决Exception quot;unhandled TypeErrorquot; expected str, bytes or os.PathLike object, no
- IIS7下 【请求被中止: 未能创建 SSL/TLS 安全通道 】 解决方法
- 禁止复制粘贴_网页禁止你复制粘贴?新同事教我这三招,全网内容随我复制
- r语言 四格画图_R绘图基础(一)
- 2020软考架构设计师真题
- 智能车改舵机中值步骤_智能车制作全过程(飞思卡尔---舵机篇)
- 用hyperf框架开发JsonRpc服务
- 格力机器人图解_你所不知道的格力机器人战略
- pandas计算环比与同比
- ISBN(国际标准书号)
- 阿里云os边缘应用程序的三个问题
- 深夜谈【辱母杀人案】
- PowerBI数据处理-聚合
- 为什么手机网速太慢_为什么手机信号满格,网速却很慢?别再错怪手机了
- E5 调用API续订服务:Microsoft 365 E5 Renew X
- 基于 Nios II 的串口打印和流水灯设计【使用 Quartus 软件】【掌握 SOPC 开发流程】
- 【Dell PowerEdge T640 无法适配3090引起的噪声问题的解决】
- MySQL8 mysqldump参数说明
- mac中html绝对路径怎么写,mac查看路径