在C语言中实现HTTP文件上传功能,可以使用libcurl库。以下是一个简单的示例:
首先,确保已经安装了libcurl库。在Ubuntu系统中,可以使用以下命令安装:
```bash
sudo apt-get install libcurl4-openssl-dev
```
接下来,创建一个名为`http_upload.c`的C文件,并添加以下代码:
```c
#include
#include
#include
#include
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t written = fwrite(ptr, size, nmemb, stream);
return written;
}
int main(void) {
CURL *curl;
FILE *fp;
char url[BUFSIZ];
char outfilename[] = "uploaded_file";
char infilename[] = "input_file";
char data[BUFSIZ];
// 设置请求头
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
res = CURLE_OK;
curl_setopt(curl, CURLOPT_URL, "http://example.com/upload");
curl_setopt(curl, CURLOPT_POSTFIELDS, "file=@" + infilename);
curl_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_setopt(curl, CURLOPT_READDATA, &infilename);
curl_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_setopt(curl, CURLOPT_WRITEDATA, &outfilename);
curl_setopt(curl, CURLOPT_TIMEOUT, 5L);
curl_setopt(curl, CURLOPT_NOPROGRESS, 0L);
curl_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
// 初始化CURL对象
res = curl_easy_init(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_init() failed: %sn", curl_easy_strerror(res));
exit(EXIT_FAILURE);
}
// 执行请求
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %sn", curl_easy_strerror(res));
exit(EXIT_FAILURE);
}
// 获取响应数据
res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_getinfo() failed: %sn", curl_easy_strerror(res));
exit(EXIT_FAILURE);
}
// 关闭CURL对象
curl_easy_cleanup(curl);
// 读取响应数据
fp = fopen(outfilename, "wb");
if (fp == NULL) {
fprintf(stderr, "Failed to open file for writing: %sn", strerror(errno));
exit(EXIT_FAILURE);
}
// 写入响应数据
memset(data, 0, sizeof(data));
strncpy(data, response_code, sizeof(data));
fwrite(data, sizeof(char), strlen(data), fp);
fclose(fp);
// 释放资源
curl_global_cleanup();
return 0;
}
```
编译并运行程序:
```bash
gcc http_upload.c -o http_upload -lcurl
./http_upload
```
注意:这个示例仅用于演示目的,实际应用中可能需要根据具体需求进行修改。