LibCURL 将文件从 C++ 上传到 PHP - 需要 411 长度
LibCURL upload file from C++ to PHP - 411 length required
我正在尝试使用 LibCURL、C++ 和 php 从我的本地计算机将文件写入服务器,但我 运行 遇到错误,而不是完成表单,我收到错误消息“需要 411 长度”。
我正在使用这个例子
http://curl.haxx.se/libcurl/c/postit2.html
这是我的 php 表格,我已验证其有效
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Enter file: <input type="file" name="sendfile" size="40">
<input type="submit" value="send" name="submit">
</form>
<?php
echo “request method: " . $_SERVER[REQUEST_METHOD];
if( "$_SERVER[REQUEST_METHOD]" == "POST" || "$_SERVER[REQUEST_METHOD]" == "PUT")
{
echo "Success <br>";
if( $_FILES['sendfile']['name'] != "" )
{
$target_dir = "test/";
$target_file = $target_dir . basename($_FILES["sendfile"]["name"]);
if (move_uploaded_file($_FILES["sendfile"]["tmp_name"], $target_file))
{
echo "The file ". basename( $_FILES["sendfile"]["name"]). " has been uploaded.";
}
else
{
echo "Sorry, there was an error uploading your file.";
}
}
else
{
die("No file specified!");
}
}
?>
</body>
</html>
这是 libcurl 代码,除了设置上传文件部分中的 3 行之外,它非常忠实于示例。这是我根据不同的例子尝试的。
//setup
curl_global_init(CURL_GLOBAL_ALL);
handle = curl_easy_init();
post = NULL;
last = NULL;
header_list = NULL;
uploadFile = NULL;
curl_easy_setopt(handle, CURLOPT_NOPROGRESS, ofGetLogLevel() <= OF_LOG_VERBOSE ? 0 : 1);
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, true);
curl_easy_setopt(handle, CURLOPT_VERBOSE, ofGetLogLevel() <= OF_LOG_VERBOSE);
curl_easy_setopt(handle, CURLOPT_CAINFO, ofToDataPath("cacert.pem").c_str());
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, content_writer);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &content);
curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, header_writer);
curl_easy_setopt(handle, CURLOPT_WRITEHEADER, &header);
//seturl
curl_easy_setopt(handle, CURLOPT_URL, “link to hosted php file on server”);
//add form field
curl_formadd(&post, &last, CURLFORM_COPYNAME, "sendfile", CURLFORM_FILE, “filepath on my local system”, CURLFORM_END);
//set upload file
FILE* uploadFile = fopen(“filepath on my local system”, "rb");
curl_easy_setopt(handle, CURLOPT_UPLOAD, 1);
curl_easy_setopt(handle, CURLOPT_READDATA, uploadFile);
//perform
CURLcode ret = curl_easy_setopt(handle, CURLOPT_VERBOSE, ofGetLogLevel() <= OF_LOG_VERBOSE);
ret = curl_easy_setopt(handle, CURLOPT_NOPROGRESS, ofGetLogLevel() <= OF_LOG_VERBOSE ? 0 : 1);
ret = curl_easy_setopt(handle, CURLOPT_HTTPPOST, post);
ret = curl_easy_perform(handle);
curl_formfree(post);
post = NULL;
fclose(uploadFile);
uploadFile = NULL;
我试过用字符串 "Content-Length: 0" 和 "Content-Length: 44000" (测试 jpg 的大小)添加 header 但都没有改变错误。
这里有类似的问题,但只有一个是使用 c++,就是这个
error 411 Length Required c++, libcurl PUT request
但它不太适合我的情况,也没有提供任何答案。
像这样设置CURLOPT_INFILESIZE:
curl_easy_setopt(句柄, CURLOPT_INFILESIZE, 44000);
我正在尝试使用 LibCURL、C++ 和 php 从我的本地计算机将文件写入服务器,但我 运行 遇到错误,而不是完成表单,我收到错误消息“需要 411 长度”。
我正在使用这个例子
http://curl.haxx.se/libcurl/c/postit2.html
这是我的 php 表格,我已验证其有效
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Enter file: <input type="file" name="sendfile" size="40">
<input type="submit" value="send" name="submit">
</form>
<?php
echo “request method: " . $_SERVER[REQUEST_METHOD];
if( "$_SERVER[REQUEST_METHOD]" == "POST" || "$_SERVER[REQUEST_METHOD]" == "PUT")
{
echo "Success <br>";
if( $_FILES['sendfile']['name'] != "" )
{
$target_dir = "test/";
$target_file = $target_dir . basename($_FILES["sendfile"]["name"]);
if (move_uploaded_file($_FILES["sendfile"]["tmp_name"], $target_file))
{
echo "The file ". basename( $_FILES["sendfile"]["name"]). " has been uploaded.";
}
else
{
echo "Sorry, there was an error uploading your file.";
}
}
else
{
die("No file specified!");
}
}
?>
</body>
</html>
这是 libcurl 代码,除了设置上传文件部分中的 3 行之外,它非常忠实于示例。这是我根据不同的例子尝试的。
//setup
curl_global_init(CURL_GLOBAL_ALL);
handle = curl_easy_init();
post = NULL;
last = NULL;
header_list = NULL;
uploadFile = NULL;
curl_easy_setopt(handle, CURLOPT_NOPROGRESS, ofGetLogLevel() <= OF_LOG_VERBOSE ? 0 : 1);
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, true);
curl_easy_setopt(handle, CURLOPT_VERBOSE, ofGetLogLevel() <= OF_LOG_VERBOSE);
curl_easy_setopt(handle, CURLOPT_CAINFO, ofToDataPath("cacert.pem").c_str());
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, content_writer);
curl_easy_setopt(handle, CURLOPT_WRITEDATA, &content);
curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, header_writer);
curl_easy_setopt(handle, CURLOPT_WRITEHEADER, &header);
//seturl
curl_easy_setopt(handle, CURLOPT_URL, “link to hosted php file on server”);
//add form field
curl_formadd(&post, &last, CURLFORM_COPYNAME, "sendfile", CURLFORM_FILE, “filepath on my local system”, CURLFORM_END);
//set upload file
FILE* uploadFile = fopen(“filepath on my local system”, "rb");
curl_easy_setopt(handle, CURLOPT_UPLOAD, 1);
curl_easy_setopt(handle, CURLOPT_READDATA, uploadFile);
//perform
CURLcode ret = curl_easy_setopt(handle, CURLOPT_VERBOSE, ofGetLogLevel() <= OF_LOG_VERBOSE);
ret = curl_easy_setopt(handle, CURLOPT_NOPROGRESS, ofGetLogLevel() <= OF_LOG_VERBOSE ? 0 : 1);
ret = curl_easy_setopt(handle, CURLOPT_HTTPPOST, post);
ret = curl_easy_perform(handle);
curl_formfree(post);
post = NULL;
fclose(uploadFile);
uploadFile = NULL;
我试过用字符串 "Content-Length: 0" 和 "Content-Length: 44000" (测试 jpg 的大小)添加 header 但都没有改变错误。
这里有类似的问题,但只有一个是使用 c++,就是这个
error 411 Length Required c++, libcurl PUT request
但它不太适合我的情况,也没有提供任何答案。
像这样设置CURLOPT_INFILESIZE: curl_easy_setopt(句柄, CURLOPT_INFILESIZE, 44000);