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文件下载相关推荐

  1. goahead实现文件下载功能实例详解

    总体来说,goahead实现文件下载功能比较简单,基本上是调用固定的函数,但是也有一些坑,下面详细讲解我的实例记录. (1)定义下载的回调函数 websDefineAction("downl ...

  2. web server大全之GoAhead移植(转载)

    转自:http://linux.chinaunix.net/techdoc/develop/2009/06/19/1119124.shtml 注:最近在做goAhead web server和移植其到 ...

  3. ini文件怎么使用_ftp文件下载工具,ftp文件下载工具是怎么使用的?使用指南

    ftp文件下载工具是什么工具,可能有人会回答说不知道,因为一般只有从事网站管理的工作者会使用的多一点.但不是每个人生来就会的,所以刚开始肯定都会学习怎么使用.这篇文章就来教一下大家ftp文件下载工具是 ...

  4. 在ASP.NET中跟踪和恢复大文件下载

    在Web应用程序中处理大文件下载的问题一直出了名的困难,因此对于大多数站点来说,如果用户的下载被中断了,它们只能说悲哀降临到用户的身上了.但是我们现在不必这样了,因为你可以使自己的ASP.NET应用程 ...

  5. Apache,Nginx,Lighttpd分别使用X-sendfile功能提升文件下载性能

    关于mod_xsendfile https://tn123.org/mod_xsendfile/ Lighttpd中的X-sendfile RoR网站如何利用lighttpd的X-sendfile功能 ...

  6. java 文件下载 【学习记录】

    工具类 public static Boolean downloadExcelFile(HttpServletResponse response, String fileName) {OutputSt ...

  7. python写一个文件下载器_Python3使用TCP编写一个简易的文件下载器

    原标题:Python3使用TCP编写一个简易的文件下载器 利用Python3来实现TCP协议,和UDP类似.UDP应用于及时通信,而TCP协议用来传送文件.命令等操作,因为这些数据不允许丢失,否则会造 ...

  8. node简单实现excel文件下载

    1.利用csv格式兼容实现 csv是一种利用','.'\t'.'\n'等分隔符存储的文本文件,excel可兼容打开,利用此原理,代码实现如下: app.use(route.get('/export', ...

  9. java ftp下载文件源码_java实现ftp文件下载的源代码

    这几天做的一个项目中用到了ftp文件传输,用java实现了ftp文件的下载. 一.win7下搭建ftp服务器 详见:http://jingyan.baidu.com/article/4b52d7026 ...

  10. 使用C++基于Socket编程实现文件下载(改进-封装成类)

    使用: (1)首先运行服务端,待服务端运行起来: (2)最后运行客户端,输入要传输文件到哪个目标机器的IP地址: (3)输入传输文件的路径及文件(完成的路径),其中包含文件的类型,也就是后缀需要包含( ...

最新文章

  1. 6个2教你认识递归的力量!
  2. PyQt:成功解决Exception quot;unhandled TypeErrorquot; expected str, bytes or os.PathLike object, no
  3. IIS7下 【请求被中止: 未能创建 SSL/TLS 安全通道 】 解决方法
  4. 禁止复制粘贴_网页禁止你复制粘贴?新同事教我这三招,全网内容随我复制
  5. r语言 四格画图_R绘图基础(一)
  6. 2020软考架构设计师真题
  7. 智能车改舵机中值步骤_智能车制作全过程(飞思卡尔---舵机篇)
  8. 用hyperf框架开发JsonRpc服务
  9. 格力机器人图解_你所不知道的格力机器人战略
  10. pandas计算环比与同比
  11. ISBN(国际标准书号)
  12. 阿里云os边缘应用程序的三个问题
  13. 深夜谈【辱母杀人案】
  14. PowerBI数据处理-聚合
  15. 为什么手机网速太慢_为什么手机信号满格,网速却很慢?别再错怪手机了
  16. E5 调用API续订服务:Microsoft 365 E5 Renew X
  17. 基于 Nios II 的串口打印和流水灯设计【使用 Quartus 软件】【掌握 SOPC 开发流程】
  18. 【Dell PowerEdge T640 无法适配3090引起的噪声问题的解决】
  19. MySQL8 mysqldump参数说明
  20. mac中html绝对路径怎么写,mac查看路径

热门文章

  1. html如何添加字体
  2. warning: #61-D: integer operation result is out of range
  3. 服务器备案全流程超级详细
  4. vim配置——MA6174
  5. python带你过不一样的“清明节”和看神奇的《清明上河图》
  6. java后端要会写前端吗_后端开发有必要学习前端吗,如何入门呢
  7. 使用anaconda安装pytorch
  8. pytorch 安装教程
  9. 【专家推荐】保姆级开源工具推荐,一用一个爽,非常劲爆(收藏系列)
  10. ps中怎么调整字体间距