goahead文件下载
来源:互联网 发布:java 日志级别设置 编辑:程序博客网 时间:2024/05/22 06:58
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_ROM if (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_DEBUG if (wp->referrer) { trace(1, "From %s", wp->referrer); } #endif websError(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; }
阅读全文
0 0
- goahead文件下载
- goahead文件上传
- 给goahead-3.1.0-2 web服务器 增加 任意盘符文件下载功能
- goahead上传文件的问题
- goahead
- goahead
- Goahead 文件上传速度过慢原因分析
- goAhead上实现文件上传到嵌入式web服务器上
- goAhead上实现文件上传到嵌入式web服务器上
- goAhead上实现文件上传到嵌入式web服务器上
- goahead使用matrix支持ssl错误解决 goahead2.5,matrix-3.1.3下载
- goahead-overview
- goAhead 编译
- goahead 移植
- GoAhead初探
- goahead移植
- 初识GoAhead
- GoAhead 2.1.8嵌入式webserver源码分析学习(二)---源码文件结构分析
- 孤儿进程和僵尸进程详解
- 欢迎使用CSDN-markdown编辑器
- 1031. 查验身份证(15)
- redis基础总结
- FCN-数据篇
- goahead文件下载
- 分答项目_知识点:composer
- OS 请求调页存储管理方式的FIFO、LRU、OPT、LFU置换算法模拟
- 无线轮播+webView
- Codeforces 895C
- 去重算法
- HDU 1224 Free DIY Tour
- iOS---购物车
- 判断是否为回文数