用C语言编写multipart.rar

  • wangkedelh
    了解作者
  • C/C++
    开发工具
  • 1KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 3
    下载次数
  • 2020-06-10 17:58
    上传日期
用C语言实现multipart/form-data文件上传,没有用到curl之类的库。之前做个小的日志上传程序写的。
用C语言编写multipart.rar
  • 用C语言编写multipart.c
    4KB
内容介绍
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <arpa/inet.h rel='nofollow' onclick='return false;'> #include <string.h> #include <sys/time.h> #include <sys/select.h> #include <fcntl.h> #include <errno.h> #define SERVER_ADDR "192.168.1.123" #define SERVER_PORT 10086 char upload_head[] = "POST /Logupload/upload?userid=%s HTTP/1.1\r\n" "Host: %s:%d\r\n" "Connection: keep-alive\r\n" "Content-Type: multipart/form-data; boundary=%s\r\n" "Content-Length: %d\r\n\r\n" "--%s\r\n" "Content-Disposition: form-data; name=\"file\"; filename=\"%s\"\r\n" "Content-Type: application/octet-stream;chartset=UTF-8\r\n\r\n"; char upload_request[] = "--%s\r\n" "Content-Disposition: form-data; name=\"file\"; filename=\"%s\"\r\n" "Content-Type: application/octet-stream;chartset=UTF-8\r\n\r\n"; int Connect_Server(char *severip,int port) { int sock = -1; struct sockaddr_in addr; if(severip == NULL || port <= 0) return -1; memset(&addr,0,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); inet_pton(AF_INET,severip,&addr.sin_addr.s_addr); sock = socket(AF_INET,SOCK_STREAM,0); if(-1 == sock) return -1; if(connect(sock,(struct sockaddr*)&addr,sizeof(addr)) < 0) { close(sock); return -1; } return sock; } int main(int argc,char *argv[]) { char filename[256] = {0}; int sock = -1; char send_date[4096] = {0}; char send_end[128] = {0}; char send_request[2048] = {0}; FILE *fp = NULL; char *userid = "00000000199"; char boundary[64] = {0}; int ret = -1,already = -1,ContentLength = -1; long long int timestamp; struct timeval tv; if(argc < 2) return -1; strncpy(filename,argv[1],256); if(access(filename,F_OK) != 0) { printf("file %s not exsit!\n",filename); return -1; } //连接服务器 sock = Connect_Server(SERVER_ADDR,SERVER_PORT); if(sock < 0 ) { printf("connect server error!\n"); return -1; } //打开要上传的文件,获取文件的大小,用于计算Content-Length的大小 fp = fopen(filename,"rb"); if(fp == NULL) { printf("open file %s error!\n",filename); close(sock); return -1; } fseek(fp,0,SEEK_END); ContentLength = ftell(fp); rewind(fp); //获取毫秒级的时间戳用于boundary的值 gettimeofday(&tv,NULL); timestamp = (long long int)tv.tv_sec * 1000 + tv.tv_usec; snprintf(boundary,64,"---------------------------%lld",timestamp); // Content-Length的大小还包括了对上传文件的描述,开始boundary和结束boundary ContentLength += snprintf(send_request,2048,upload_request,boundary,filename); ContentLength +=snprintf(send_end,2048,"\r\n--%s--\r\n",boundary); //发送的http头和上传文件的描述 ret = snprintf(send_date,4096,upload_head,userid,SERVER_ADDR,SERVER_PORT,boundary,ContentLength,boundary,filename); if(send(sock,send_date,ret,0) != ret) { printf("send head error!\n"); close(sock); return -1; } //循环读取文件,并往服务器上面发送,直到文件结束为止 clearerr(fp); while(1) { memset(send_date,0,sizeof(send_date)); ret = fread(send_date,1,4096,fp); if(ret != 4096) { if(!ferror(fp)) { if(send(sock,send_date,ret,0) != ret) { printf("send the end date error!\n"); close(sock); fclose(fp); return -1; } fclose(fp); break; } else { printf("read file error!\n"); close(sock); fclose(fp); return -1; } } if(send(sock,send_date,4096,0) != 4096) { printf("send date error\n"); close(sock); fclose(fp); return -1; } } //发送最后的boundary结束文件上传。 SEND_END: memset(send_date,0,sizeof(send_date)); ret = snprintf(send_date,4096,"\r\n--%s--\r\n",boundary); if(send(sock,send_date,ret,0) != ret) { close(sock); return -1; } printf("send to server end date:%s\n",send_date); //接收返回值,用于判断是否上传成功 memset(send_date,0,sizeof(send_date)); if(recv(sock,send_date,4096,0) < 0) printf("recv error!\n"); printf("recv:%s\n",send_date); close(sock); return 0; }
评论
    相关推荐
    • Shark CGI Function-开源
      Shark CGI函数简化了C语言中的CGI编程。它从GET,POST和multipart / form-data表单(包括文件上传和cookie)中提取变量和内容,并使它们可以作为环境变量进行访问。 请参阅主页以获取更多信息。
    • 轻量级Web服务器teepeedee2.zip
      John Fremlin去年在东京的Linux用户组上演示了teepeedee2的性能,他声称函数式编程语言(LISP属于函数语言)能战胜C语言。现在他的博客运行的就是teepeedee2,能即时显示用户评论,被/.之后也没出现问题。 ...
    • 先锋无组件上传类(无惧2.0杜绝上传漏洞修改版) v2004
      我们知道计算机里面的数据是一"\0"为标致的用过C语言的都知道 char data[]="bbs" 这个data数组长度是4: b b s \0 如果我们构造filepath如下,会怎么样呢? filepath="/newmm.asp\0" 我们在2004.09.24.08.24传的...
    • webapp-master.zip
      术语 编程 /* 个人理解:如果编程语言能够实现对应的feature,编程语言完全可以是承载函数式编程或面向对象编程 待详读文章:https://fsharpforfunandprofit.com/posts/thinking-functionally-intro/ ...
    • C语言编写multipart/form-data实现上传文件
      C语言实现multipart/form-data文件上传,没有用到curl之类的库。之前做个小的日志上传程序写的。
    • iOS音乐播放器
      资源来自百度音乐API; 使用oc语言开发; 项目完整,内容丰富,值得学习。
    • 基于asp.net 的文件上传和下载
      关于使用asp.net进行文件上传下载的文章,内容比较透彻
    • iOS-BaseArch:iOS开发基础架构
      使用了MVVM架构,以及面向切面编程,最低版本 iOS 7.0,主要使用Objective C语言。 为什么使用 MVVM MVVM 可以兼容你当下使用的 MVC 架构 MVVM 增加你的应用的可测试性 简化了控制器内容 归并了工具类 易于动态映射 ...
    • 阿里云开放存储服务的C语言SDKOSSC.zip
      OSSC完全采用C语言开发,并实现了类似面向对象的调用方式,遵循了良好的编码规范,目前OSSC除了提供了OSS开放接口文档中所描述的四大类功能外(Bucket 操作、Object 操作、Multipart Upload操作、Object Group 操作...
    • Proteus7.12.rar
      Proteus7.12完美破解版.rar电路仿真软件很好用可以仿真单片数字模拟电路