文件上传失败解决过程
写了一个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
文件上传失败解决过程相关推荐
- 【CSDN】创作区上传图片-粘贴/文件上传失败解决!
今天创作过程中,出现以下问题: 粘贴图片,是虚的图片,带着一种我困惑的朦胧感!预期效果应该是后者!! 保存为草稿后,不管是预览还是重新打开,图片消失不在!朦胧感果然有问题! 随后的文件上传,也均失败! ...
- Centos7安装JDK【FinalShell终端本地文件上传失败解决办法】
1.将下载好的安装包 jdk-8u211-linux-x64.tar.gz 上传到服务器指定目录下 上传错误:上传失败 原因分析:权限不足,之前连接的是user用户不是root用户. 解决办法:修改连 ...
- linux解决文件上传失败的问题
linux解决文件上传失败的问题 发布测试的时候遇到一个问题,拖动jar包到服务器显示上传成功,但是启动的时候报错了,结果一看jar包大小0kb.以此记录解决过程,以便以后使用. 1.使用 df -h ...
- Struts2文件上传方式与上传失败解决方式
首先将几个对象弄出来 第一个 上传页面 第二个 上传action 第三个 startut2配置文件 我的文字描述不是很好,但是终归是自己写出来的,后来我在网上看到一篇关于文件上传描述的非常清楚的文章, ...
- php大文件上传失败的原因及解决方法
php大文件上传失败的原因及解决方法 参考文章: (1)php大文件上传失败的原因及解决方法 (2)https://www.cnblogs.com/cxx8181602/p/9282576.html ...
- 解决因nginx配置导致文件上传失败的问题 The filed file exceeds its maximum permitted size of 1048576 bytes
解决因nginx配置问题导致文件上传失败的问题 1.问题背景 2.问题截图 3.问题分析 4.问题解决(修改nginx的配置) 5.解决之后的"后遗症"(截图) 6.分析并解决&q ...
- java ftp 下载慢_Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题
废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String usern ...
- vs文件上传失败--超过最大字符限制
一.问题 在文件上传时,会遇到大文件上传失败. >F12查看报错网络请求返回结果 >问题分析 由于vs上传文件默认的字符大小控制. 二.解决方法 >在web.config中修改或添加 ...
- 关于文件上传失败的问题
关于文件上传失败的问题 项目上线后,用户反馈文件上传失败.看了下日志 定位到了这里: 获取storeStorage失败,把错误码在网上一搜索 发现原来是fastdfsStorage所在的磁盘占用达到百 ...
最新文章
- urlrewrite使用小结
- 为什么升级不了android版本,为啥你的手机无法升级到安卓7.0?原因都在这里!...
- Chrome 提标 您的浏览器限制了第三方Cookie...解决方法
- rsync 常见错误与解决方法整理
- Swift2.0语言教程之函数的返回值与函数类型
- python【力扣LeetCode算法题库】20- 有效的括号(辅助栈)
- 实战:在远程网络配置DNS转发
- 网络部署过程中_郑州萤火云SEO网络优化:SEO过程中的容易犯的错误
- python123九宫格输入法_《啊哈C语言-2016最新修正版》.pdf
- PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.22. 子查询表达式
- java 线程状态_【19期】为什么Java线程没有Running状态?
- 梅林安装opkg后安装iperf3_阳台到底有没有必要安装推拉门?利与弊告诉你,不要等安装后后悔...
- asynDBCenter(修改)
- 科学计算与MATLAB语言之基础知识
- div 空隙_尖叫到建筑的空隙
- 腾讯视频网页版无法连接服务器失败怎么办,腾讯视频突然不能投屏怎么解决 腾讯视频突然不能投屏解决方法...
- 2003年新版CCNP考试大纲---CITV5.0(转)
- ecshop 邮件模板 html,ecshop邮件模板默认数据与恢复.doc
- python倒计时定时器_使用python修饰器的定时器倒计时
- [梆梆安全]游戏广告条被篡改原理和APK加固保护方法
热门文章
- 2020年CFA考试第三次延期更改时间公布!
- 3ds max导出fbx模型出现破裂
- Python+Vue计算机毕业设计医院碳排放管理平台r392w(源码+程序+LW+部署)
- 基于php的体育用品在线销售系统网站
- 【问题解决】python中round()函数并非四舍五入
- OceanBase CTO杨传辉:放手去干,这行没有35岁危机
- MacX DVD Ripper Pro for Mac(DVD格式转换工具)
- 微信读书产品设计中的心理学
- 通过Ip得到城市实现步骤
- jqgrid 列排序 php,jqGrid排序问题及解决办法