写了一个html+cgi实现文件上传的功能,使用html始终无法将文件上传上去,cgi解析不到文件名和文件内容。使用postman就可以上传成功。下面是源文件:
post.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Test</title>
</head><body><form action="/cgi-bin/out.cgi" method="POST"><input name="file" type="file" /><input type="submit" /></form>
</body></html>

out.c

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "cgic.h"
#define BufferLen 1024
int cgiMain(void)
{cgiFilePtr file;int targetFile;mode_t mode;char name[128];char fileNameOnServer[64];char contentType[1024];char buffer[BufferLen];char *tmpStr = NULL;int size;int got, t;cgiHeaderContentType("text/html");printf("aaa\n");//取得html页面中file元素的值,应该是文件在客户机上的路径名if (cgiFormFileName("file", name, sizeof(name)) != cgiFormSuccess){fprintf(stdout, "could not retrieve filename\n");goto FAIL;}cgiFormFileSize("file", &size);//取得文件类型,不过本例中并未使用cgiFormFileContentType("file", contentType, sizeof(contentType));//目前文件存在于系统临时文件夹中,通常为/tmp,通过该命令打开临时文件。临时文件的名字与用户文件的名字不同,所以不能通过路径/tmp/userfilename的方式获得文件if (cgiFormFileOpen("file", &file) != cgiFormSuccess){fprintf(stdout, "could not open the file\n");goto FAIL;}t = -1;//从路径名解析出用户文件名while (1){tmpStr = strstr(name + t + 1, "\\");if (NULL == tmpStr)tmpStr = strstr(name + t + 1, "/"); //if "\" is not path separator, try "/"if (NULL != tmpStr)t = (int)(tmpStr - name);elsebreak;}strcpy(fileNameOnServer, name + t + 1);printf("%s\n", fileNameOnServer);mode = S_IRWXU | S_IRGRP | S_IROTH;//在当前目录下建立新的文件,第一个参数实际上是路径名,此处的含义是在cgi程序所在的目录(当前目录))建立新文件targetFile = open(fileNameOnServer, O_RDWR | O_CREAT | O_TRUNC | O_APPEND, mode);if (targetFile < 0){fprintf(stdout, "could not create the new file,%s\n", fileNameOnServer);goto FAIL;}//从系统临时文件中读出文件内容,并放到刚创建的目标文件中while (cgiFormFileRead(file, buffer, BufferLen, &got) == cgiFormSuccess){if (got > 0)write(targetFile, buffer, got);}cgiFormFileClose(file);close(targetFile);goto END;
FAIL:printf("Failed to upload");return 1;
END:printf("File " "%s" " has been uploaded", fileNameOnServer);return 0;
}

因为用postman可以上传文件成功,所以定位问题在html文件中,但是html就只有三行关于form表单提交的代码,哪里会出错呢,会不会是文件编码有问题,加了 <meta charset="utf-8"> 还是不行,进行了若干次修改后还是失败。没办法,那就抓包找用html文件和用postman上传的差异:
postman:

用html文件上传:

发现两者的Content-Type不一样,
postman的为content-type: multipart/form-data;
用html文件上传的是:Content-Type: application/x-www-form-urlencoded
这是不是就是上传失败的原因呢?
在html文件中指定类型:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Test</title>
</head><body><form action="/cgi-bin/out.cgi" method="POST" enctype="multipart/form-data"><input name="file" type="file" /><input type="submit" /></form>
</body></html>

上传成功!
over

文件上传失败解决过程相关推荐

  1. 【CSDN】创作区上传图片-粘贴/文件上传失败解决!

    今天创作过程中,出现以下问题: 粘贴图片,是虚的图片,带着一种我困惑的朦胧感!预期效果应该是后者!! 保存为草稿后,不管是预览还是重新打开,图片消失不在!朦胧感果然有问题! 随后的文件上传,也均失败! ...

  2. Centos7安装JDK【FinalShell终端本地文件上传失败解决办法】

    1.将下载好的安装包 jdk-8u211-linux-x64.tar.gz 上传到服务器指定目录下 上传错误:上传失败 原因分析:权限不足,之前连接的是user用户不是root用户. 解决办法:修改连 ...

  3. linux解决文件上传失败的问题

    linux解决文件上传失败的问题 发布测试的时候遇到一个问题,拖动jar包到服务器显示上传成功,但是启动的时候报错了,结果一看jar包大小0kb.以此记录解决过程,以便以后使用. 1.使用 df -h ...

  4. Struts2文件上传方式与上传失败解决方式

    首先将几个对象弄出来 第一个 上传页面 第二个 上传action 第三个 startut2配置文件 我的文字描述不是很好,但是终归是自己写出来的,后来我在网上看到一篇关于文件上传描述的非常清楚的文章, ...

  5. php大文件上传失败的原因及解决方法

    php大文件上传失败的原因及解决方法 参考文章: (1)php大文件上传失败的原因及解决方法 (2)https://www.cnblogs.com/cxx8181602/p/9282576.html ...

  6. 解决因nginx配置导致文件上传失败的问题 The filed file exceeds its maximum permitted size of 1048576 bytes

    解决因nginx配置问题导致文件上传失败的问题 1.问题背景 2.问题截图 3.问题分析 4.问题解决(修改nginx的配置) 5.解决之后的"后遗症"(截图) 6.分析并解决&q ...

  7. java ftp 下载慢_Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String usern ...

  8. vs文件上传失败--超过最大字符限制

    一.问题 在文件上传时,会遇到大文件上传失败. >F12查看报错网络请求返回结果 >问题分析 由于vs上传文件默认的字符大小控制. 二.解决方法 >在web.config中修改或添加 ...

  9. 关于文件上传失败的问题

    关于文件上传失败的问题 项目上线后,用户反馈文件上传失败.看了下日志 定位到了这里: 获取storeStorage失败,把错误码在网上一搜索 发现原来是fastdfsStorage所在的磁盘占用达到百 ...

最新文章

  1. urlrewrite使用小结
  2. 为什么升级不了android版本,为啥你的手机无法升级到安卓7.0?原因都在这里!...
  3. Chrome 提标 您的浏览器限制了第三方Cookie...解决方法
  4. rsync 常见错误与解决方法整理
  5. Swift2.0语言教程之函数的返回值与函数类型
  6. python【力扣LeetCode算法题库】20- 有效的括号(辅助栈)
  7. 实战:在远程网络配置DNS转发
  8. 网络部署过程中_郑州萤火云SEO网络优化:SEO过程中的容易犯的错误
  9. python123九宫格输入法_《啊哈C语言-2016最新修正版》.pdf
  10. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.22. 子查询表达式
  11. java 线程状态_【19期】为什么Java线程没有Running状态?
  12. 梅林安装opkg后安装iperf3_阳台到底有没有必要安装推拉门?利与弊告诉你,不要等安装后后悔...
  13. asynDBCenter(修改)
  14. 科学计算与MATLAB语言之基础知识
  15. div 空隙_尖叫到建筑的空隙
  16. 腾讯视频网页版无法连接服务器失败怎么办,腾讯视频突然不能投屏怎么解决 腾讯视频突然不能投屏解决方法...
  17. 2003年新版CCNP考试大纲---CITV5.0(转)
  18. ecshop 邮件模板 html,ecshop邮件模板默认数据与恢复.doc
  19. python倒计时定时器_使用python修饰器的定时器倒计时
  20. [梆梆安全]游戏广告条被篡改原理和APK加固保护方法

热门文章

  1. 2020年CFA考试第三次延期更改时间公布!
  2. 3ds max导出fbx模型出现破裂
  3. Python+Vue计算机毕业设计医院碳排放管理平台r392w(源码+程序+LW+部署)
  4. 基于php的体育用品在线销售系统网站
  5. 【问题解决】python中round()函数并非四舍五入
  6. OceanBase CTO杨传辉:放手去干,这行没有35岁危机
  7. MacX DVD Ripper Pro for Mac(DVD格式转换工具)
  8. 微信读书产品设计中的心理学
  9. 通过Ip得到城市实现步骤
  10. jqgrid 列排序 php,jqGrid排序问题及解决办法