Cli curl到PHP curl用于上传文件


cli curl to php curl for uploading file

我正在尝试设置php curl库调用:

curl --location '
     --header "authorization: LOW $accesskey:$secret" '
     --upload-file /home/samuel/public_html/intro-to-k.pdf '
     http://s3.us.archive.org/sam-s3-test-08/demo-intro-to-k.pdf

(这是Internet archive的api: http://archive.org/help/abouts3.txt)

这是目前在Windows 7开发盒,但将移动到Ubuntu

I have try:

        $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('authorization: LOW XXXX:XXXXX'));
    curl_setopt($ch, CURLOPT_VERBOSE, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_URL, 'http://s3.us.archive.org/a_tested_working_dir/the_file_ane_and_ext' );
    $post_array = array(
        "upload-file"=>file_get_contents($absolute_path_to_my_file)
    );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_array);
    $response = curl_exec($ch);
    echo $response;

错误:malformmedpostrequestpost请求的主体不是格式良好的multipart/form-databucket必须在dns hostnameXXXXXXXXXX

我可以将自己的值替换到cli curl语句&上传无问题;我无法正确设置php的curl

TIA !


生成的——libcurl转储:

CURLcode ret;
CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, (curl_off_t)64d);
curl_easy_setopt(hnd, CURLOPT_URL, "http://s3.us.archive.org/jeffs_test_1301_librivox/test-francesbaird3.mp3");
curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1);
curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1);
curl_easy_setopt(hnd, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.21.1 (i686-pc-mingw32) libcurl/7.21.1 OpenSSL/0.9.8r zlib/1.2.3");
curl_easy_setopt(hnd, CURLOPT_CAINFO, "C:'Program Files'Git'bin'curl-ca-bundle.crt");
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 1);
curl_easy_setopt(hnd, CURLOPT_SSH_KNOWNHOSTS, "c:/Users/JMadsen/_ssh/known_hosts");
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50);
ret = curl_easy_perform(hnd);
curl_easy_cleanup(hnd);

我认为它可能是ssl验证,但只是尝试设置为false &没有改变

上传文件的post字段初始化错误。你不需要传递文件的内容。只需传递带有@前缀的文件路径。

$post_array = array(
    "upload-file"=>'@'. $absolute_path_to_my_file
);

根据--libcurl转储添加以下选项。

curl_setopt($ch, CURLOPT_NOPROGRESS, 1);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "curl/7.21.1 (i686-pc-mingw32) libcurl/7.21.1 OpenSSL/0.9.8r zlib/1.2.3");
curl_setopt($ch, CURLOPT_CAINFO, "C:'Program Files'Git'bin'curl-ca-bundle.crt");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSH_KNOWNHOSTS, "c:/Users/JMadsen/_ssh/known_hosts");
curl_setopt($ch, CURLOPT_MAXREDIRS, 50);