【问题标题】:cURL Simple File Upload - 417 Expectation FailedcURL 简单文件上传 - 417 预期失败
【发布时间】:2012-02-25 14:31:24
【问题描述】:

我在使用 cURL 的简单文件上传帖子时遇到问题... 我做了很多次,但在这种情况下,我总是从服务器收到“417 Expectation Failed”。 当我尝试使用我的浏览器发布时,它可以 100% 工作,但不能使用 cURL。

这是我的配置:

我的简单测试表格有效:

<form action="http://images.example.com/image_upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="userfile" size="50">
    <input type="submit" name="submit">
</form>

这里是 image_upload.php:

<?php
    $uploaddir = '/var/www/images.example.com/images/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo "File is valid, and was successfully uploaded.\n";
    } else {
        echo "Upload failed";
    }
?>

我的 cURL 脚本 (image_upload.sh) 如下所示:

#!/bin/sh

file=$1

result=$(curl -s -L -F "userfile=@$file;type=application/octet-stream;" "http://images.example.com/image_upload.php")

echo $result

这里是服务器头:

> POST /image_upload.php HTTP/1.1
> User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.1.4 libidn/1.8 libssh2/0.18
> Host: images.example.com
> Accept: */*
> Content-Length: 579
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------e237975526cf
>
< HTTP/1.1 417 Expectation Failed
< Connection: close
< Content-Length: 0
< Date: Thu, 02 Feb 2012 21:29:22 GMT
< Server: lighttpd/1.4.19

我不知道错误在哪里,也许你能认出来。

【问题讨论】:

  • 你能告诉我们函数体move_uploaded_file
  • move_uploaded_file 是 php 内置函数,请参阅:link
  • 感谢您的回复,但我得到了相同的结果。 :( 有点奇怪,通过 WebForm 可以工作,但不能通过 cURL...
  • [SOLVED]: 通过将 -H "Expect:" 添加到 cURL Headers 将解决此问题。

标签: linux bash curl


【解决方案1】:

当您在以 HTTP 1.1 模式运行的代理后面时会发生这种情况,而客户端在 HTTP 1.0 中运行。在 curl 命令行中,您可以在参数中添加 --http1.0 以解决问题

【讨论】:

    【解决方案2】:

    也可以使用 set opt 标头设置来修复:

    curl_setopt($curl,CURLOPT_HTTPHEADER,array("Expect:  "));
    

    http://www.khattam.info/417-expectation-failed-in-php-curl-while-submitting-multi-part-forms-2011-04-14.html

    【讨论】:

    • c# WebClient client = new WebClient(); client.Headers.Add("期望", "");失败的。 client.Headers.Add("期望", "*");工作
    • 以上解决方案是针对PHP的
    • 在 5 年后仍然有效,但我总是对这些我不明白 为什么 它们有效的解决方案有点不舒服...
    • 我想我发现了它的工作原理,所以对于任何好奇的人:显然对于数据 > 1024 字节 CURL 自动设置“期望:100-继续”(客户端希望服务器只获取标头和然后发送“100”返回码以获取其余数据)。如果服务器不能被打扰,CURL 会产生这个错误。设置“期望:”会显式禁用此自动行为。
    【解决方案3】:

    将此添加到您的 lighttpd 配置中: server.reject-expect-100-with-417 = "禁用"

    重启 lighttpd。干杯:)

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 1970-01-01
      • 2020-01-20
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2017-07-07
      相关资源
      最近更新 更多