上传文件格式变成 application/octet-stream
时间: 2023-11-09 16:51:48 浏览: 207
用C语言编写multipart/form-data实现上传文件
5星 · 资源好评率100%
使用C语言实现multipart/form-data文件上传可以不使用curl等库。可以通过以下步骤来实现:
1.打开需要上传的文件,读取文件内容,并计算文件大小。
2.创建一个HTTP请求,设置请求头部,包括content-type为multipart/form-data。
3.将文件内容和其他参数(如果有)组织成multipart/form-data格式的数据,注意设置正确的分隔符和边界。
4.将组织好的数据写入HTTP请求体中,并发送HTTP请求到目标服务器。
5.等待服务器响应,获取上传结果。
相关代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void uploadFileServer(FILE* file, const char* fileName, const char* fileSize, const char* userId, const char* dirId) {
// 设置请求头部
const char* boundary = "---------------------------7dfefeb6c1091";
const char* contentType = "multipart/form-data; boundary=-------------------------7dfefeb6c1091";
// 计算文件大小
fseek(file, 0, SEEK_END);
long fileSize = ftell(file);
fseek(file, 0, SEEK_SET);
// 创建HTTP请求
CURL* curl = curl_easy_init();
if (curl) {
struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/octet-stream");
headers = curl_slist_append(headers, "charset=utf-8");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_URL, "http://your_upload_url");
curl_easy_setopt(curl, CURLOPT_POST, 1L);
// 组织multipart/form-data格式的数据
char* postData = (char*)malloc(fileSize + 4096); // 4096是额外的数据长度,用于存放其他参数
memset(postData, 0, fileSize + 4096);
strcpy(postData, "-----------------------------7dfefeb6c1091\r\n");
strcat(postData, "Content-Disposition: form-data; name=\"file\"; filename=\"");
strcat(postData, fileName);
strcat(postData, "\"\r\n");
strcat(postData, "Content-Type: application/octet-stream\r\n\r\n");
fread(postData + strlen(postData), fileSize, 1, file);
strcat(postData, "\r\n-----------------------------7dfefeb6c1091--\r\n");
// 将数据写入HTTP请求体中
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);
// 发送HTTP请求
CURLcode res = curl_easy_perform(curl);
// 检查上传结果
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
free(postData);
}
}
int main() {
FILE* file = fopen("path_to_file", "rb");
if (file) {
uploadFileServer(file, "filename", "filesize", "userid", "dirid");
fclose(file);
}
return 0;
}
```
阅读全文