1.文件上传

该功能通过使用cgic来实现。

(1)界面代码

<form action="file-up/download.cgi" enctype="multipart/form-data" method="post"> <table>                             // 上传文件必须设置为post + multipart/form-data<tbody><tr><td> 上传配置文件 </td><td><input type="file" name="uploadfile" value=""></td><td><input type="submit" name="upload" value="导入"></td></tr><tr><td> 下载配置文件 </td><td colspan="2"><a href="/download.html"> 配置文件导出地址 </a></td></tr></tbody></table><input type="submit" name="restart" value="刷新" >
</form>

(2)执行函数代码

enum ErrLog
{ErrSucceed,ErrOpenFile,ErrNoFile
};
enum ErrLog UploadFile()
{cgiFilePtr file;FILE *fd;char name[512];char path[128];char contentType[1024];int size = 0;int got = 0;int t = 0;char *tmp = NULL;if (cgiFormFileName("uploadfile", name, sizeof(name)) != cgiFormSuccess) //获取客户端pathname {printf("<p> No file was uploaded. </p>\n");return ErrNoFile;}fprintf(cgiOut, "The filename submitted was: ");cgiHtmlEscape(name);fprintf(cgiOut, "<br>\n");cgiFormFileSize("uploadfile", &size);fprintf(cgiOut, "The file size was: %d bytes<br>\n", size);cgiFormFileContentType("uploadfile", contentType, sizeof(contentType));fprintf(cgiOut, "The alleged content type of the file was: ");cgiHtmlEscape(contentType);fprintf(cgiOut, "<br>\n");if (cgiFormFileOpen("uploadfile", &file) != cgiFormSuccess)  //尝试打开上传的,并存放在系统中的临时文件{fprintf(cgiOut, "<p> Could not open the file. </p>\n");return ErrOpenFile;}t = -1;while (1){tmp = strstr(name+t+1, "\\");  // 从pathname解析出filenameif (NULL == tmp){tmp = strstr(name+t+1, "/");}if (NULL != tmp){t = (int)(tmp-name);}else{break;}}tmp = (char *)malloc(size * sizeof(char)); // 在底层建立新文件strcpy(path, "/usr/local/boa/data/");strcat(path, name+t+1);  fd = fopen(path, "w+");if (fd == NULL){return ErrOpenFile;}while (cgiFormFileRead(file, tmp, size, &got) == cgiFormSuccess) // 从临时文件读出content{fwrite(tmp, size, sizeof(char), fd);  //把读出的content写入新文件}fprintf(cgiOut, "<p> Upload File Success. </p>\n");cgiFormFileClose(file);free(tmp);fclose(fd);return ErrSucceed;
}

2.文件下载

(1)借助HTML中a标签实现,如:<a href="filepath" download="filename"> download </a>,则打开浏览器点击链接即可实现文件下载。

注:其中download属性可避免直接打开文件,进而执行下载任务;该方式的优点是在静态html界面即可实现文件下载,缺点是暴露了文件及其路径。

界面代码

<body>     <table><tr><td><a href="/data/xx.cfg" download="xx.cfg"> xx设置 </a></td></tr><tr><td><a href="/data/xx.cfg" download="xx.cfg"> xx模块 </a></td></tr></table><input type="button" value="返回" onclick="location.href='/cgi-bin/file-up/download.cgi'">
</body>

(2)当然,上述操作借助了部分浏览器内嵌的功能,而对于另一部分浏览器来说必须通过后台代码来实现文件的读、写和存,间接实现文件的下载,该部分可参考《嵌入式Linux下基于CGI的文件上传下载的实现》。

执行代码

void download(char *filename)
{FIFE *fp;char buff[SIZE];struct stat s;time_t date;int n;date = time(NULL);stat(filename, &s);printf(“Content Disposition:filename=\“%s\” date=%s\n”, filename, ctime(&date));printf(“Content Length:size==%d\n”, s.st_size);if (fp = fopen(filename, “r”)){while ((n = fread(buff, sizeof(char), sizeof(buff), fp)) > 0){fwrite(buff, n, 1, stdout)}fclose(fp);}
}

CGI实现文件的上传和下载相关推荐

  1. SpringMVC实现文件的上传和下载

    SpringMVC实现文件的上传和下载http://www.bieryun.com/1120.html 前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的 ...

  2. Akka实战:HTTP大文件断点上传、下载,秒传

    2019独角兽企业重金招聘Python工程师标准>>> 访问:https://github.com/yangbajing/scala-applications/tree/master ...

  3. 初学Java Web(7)——文件的上传和下载

    文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...

  4. SpringMVC实现文件的上传与下载

    文件的上传与下载可以说是工作中经常使用的功能,现在整理一下,希望能够给大家一个参考.这里以 Maven 的形式来创建项目,相关的配置文件会把主要的内容列出来,其他头文件信息不再一一全部的列出.最后会把 ...

  5. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  6. FastDFS:Java客户都实现文件的上传、下载、修改、删除

    FastDFS:Java客户都实现文件的上传.下载.修改.删除 <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...

  7. 文件的上传和下载---学习笔记

    文件上传原理 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客户端发送到服务器的标准机制. 但是JSP编程中不能使用FTP方法来上传文件,这是由JSP运行机制所决定的. JSP中上传文 ...

  8. jsp+servlet实现文件的上传和下载

    实现文件的上传和下载首先需要理解几个知识,这样才可以很好的完成文件的上传和下载: (1):上传文件是上传到服务器上,而保存到数据库是文件名 (2):上传文件是以文件转换为二进制流的形式上传的 (3): ...

  9. SpringMVC与JSON传值,取值,使用SpringMVC实现文件的上传与下载,SpringMVC拦截器

    一. JSON 1.1 什么是JSON 在实际开发中,通常需要和别的系统交换数据,数据交换的格式通常有XML和JSON等: JSON(JavaScript Object Notation:JavaSc ...

最新文章

  1. Cell综述-建立因果关系:合成菌群在植物菌群研究中的机会
  2. (完全解决)Key already registered with the same priority: GroupSpatialSoftmax
  3. java   web servelt
  4. CentOS7 redis-3.2.8 从单机到主从再到集群配置
  5. dagger2 依赖注入
  6. Given an integer, write a function to determine if it is a power of two
  7. 3DSlicer3:模块管理(一)颜色、DCM、数据、模型、注释
  8. tensorflow gpu利用率为0_训练效率低?GPU利用率上不去?快来看看别人家的tricks吧...
  9. LuaBridge 中C++类和继承示例
  10. 【LINUX学习】链接文件
  11. MIPI CSI-2规范一——概述及层级
  12. Windows Phone 7 Jump Start 系列教程
  13. Shiro 常用标签
  14. iweboffice之word——自定义菜单的使用
  15. Windows下制作DOS启动U盘的方法
  16. 三极管三种基本放大电路
  17. html和css实现导航条
  18. 第四届IT 2020高端论坛成功举办
  19. matlab改主题的命令schemer
  20. tumblr_如何在WordPress中添加Tumblr共享按钮

热门文章

  1. 【CAN总线在汽车行业中的基础应用】
  2. Oracle序列的概念、创建和使用
  3. Linux应用编程-音频应用编程-语音转文字项目
  4. spring boot 2.1学习笔记【异常】lombok.javac.apt.LombokProcessor could not be initialized
  5. Qt添加MQTT模块
  6. 贝塞尔曲线能够很好的拟合车道线吗?
  7. 15.java获取当前主机ip
  8. MOS驱动自举电容和限流电阻的选取
  9. 如何解压 .lz4 后缀文件
  10. Golang字符串拼接的方法