【问题标题】:PHP POST API no file receivedPHP POST API 未收到文件
【发布时间】:2019-05-19 02:16:51
【问题描述】:

我们的团队正在开发一个 Web 应用程序,用于使用 PHP 远程访问 3D 打印机。我们尝试使用 multipart/form-data 实现 POST print_job 部分,但它不起作用,这表明没有收到文件。这个 API 会检查 id 和 key。这是代码。任何帮助表示赞赏!

它在 Apache 2.4.39、PHP 7.3.5、XAMPP 控制面板 3.2.2 上运行。

详情如下:

<?php
function callAPI($method, $url, $data){
  $curl = curl_init();

  switch ($method){
     case "POST":
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_POST, 1);
        if ($data)
           curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        break;
     case "PUT":
        curl_setopt($curl, CURLOPT_HEADER, true);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
        if ($data)
           curl_setopt($curl, CURLOPT_POSTFIELDS, $data);                               
        break;
     default:
        if ($data)
           $url = sprintf("%s?%s", $url, http_build_query($data));
  }
  $username = "";
  $password = "";
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
  curl_setopt($curl, CURLOPT_USERPWD, $username . ":" . $password); 
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($curl, CURLOPT_TIMEOUT, 90);
  curl_setopt($curl, CURLINFO_HEADER_OUT, true);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);


  // EXECUTE:
  $result = curl_exec($curl);
  if(!$result){die("Connection Failure");}
  curl_close($curl);
  return $result;
}
?>



<?php
include('api.php');

$_SESSION['ip'] = "";
$_SESSION['url'] = "http://".$_SESSION['ip']."/api/v1";

$target_dir = "../uploads/";
$target_file = $target_dir . basename($_FILES["file"]["name"]);
move_uploaded_file($_FILES["file"]["tmp_name"], $target_file); 
$filedata = $_FILES["file"]["tmp_name"];
echo $target_file;
$data_array =  array(
  "jobname" => "file",
  "file" => "new \CURLFile(realpath($filedata))"
);
$_SESSION['size'] = $_FILES['file']['size'];
//$make_call = callAPI('POST', $_SESSION['url']."/print_job", $data_array);
$response = callAPI('POST', $_SESSION['url']."/print_job", $data_array);
$_SESSION['print'] = $response;
header('location: ../index.php');
?>

Ps:如果我想将前端获取的文件上传到远程 API,我可能需要将其存储在本地。然后我尝试了以下代码。它有效。

file_put_contents("E:/xyz/test.gcode",file_get_contents("../uploads/".$_FILES["file"]["name"]));
$filedata='E:/xyz/test.gcode';
if(!is_readable(realpath($filedata))){throw new \RuntimeException("upload file not readable!");}

$data_array =  array(
  'jobname' => 'file',
  'file' => new \CURLFile($filedata)
);

【问题讨论】:

  • 哪个部分是“显示没有收到文件”?如果 PHP 脚本没有看到它们(即,没有 $_FILES 等)然后检查文件大小 - 默认最大上传仅为 1mb IIRC。您可能需要调整您的 php.ini 并重新启动网络服务器
  • .gcode 文件大小应该没问题,只有 166kb。我认为我定义 $filedata 的方式是错误的。但是不知道怎么修改。
  • 试试print_r($_FILES["file"]) - 确保错误代码是0,你有一个临时文件名、文件的用户名和文件大小等。
  • 是的,我刚试过。错误为0,[type] =&gt; application/octet-stream
  • 这很可怜:curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false)

标签: php api curl post


【解决方案1】:

首先,不要手动设置Content-Type:multipart/form-data 标头,因为这样做会破坏边界。完整的标题看起来像:

Content-Type: multipart/form-data; boundary=------------------------777d48028c332f50

所以删除这个:

$headers = array("Content-Type:multipart/form-data"); 

让 curl 为您设置。 (将 CURLOPT_POSTFIELDS 设置为数组时,curl 将自动设置该标题,并具有正确的边界。)

其次,您不是在此处发送实际文件,您只是在发送文字字符串

new \CURLFile(realpath($filedata))

.. 如果要发送 $filedata 指向的文件,请执行

$data_array =  array(
  "jobname" => "test",
  "file" => new \CURLFile(realpath($filedata))
);

改为。

【讨论】:

  • 非常感谢!第一部分,需要把POST API图片下代码中的enctype="multipart/form-data"去掉吗?
  • @sxj1121 不,HTML 标签没问题,它们只是指示网络浏览器使用multipart/form-data 格式。
  • 非常感谢!我刚去实验室试了一下。但结果显示我以前没有看到的“连接失败”。这是否意味着我没有连接到 API?
  • @sxj1121 可能是,取决于问题所在。用$result = curl_exec($curl); if(!$result){throw new \RuntimeException("curl_exec error ".curl_errno($curl).": ".curl_error($curl));} 替换$result = curl_exec($curl); if(!$result){die("Connection Failure");} - 你现在得到了什么?
  • 它显示:uploaded../uploads/p1.gcode 致命错误:未捕获的 RuntimeException:curl_exec 错误 26:在 E:\xampp\htdocs\3dprinter\server\api.php:55 堆栈跟踪: #0 E:\xampp\htdocs\3dprinter\server\print.php(19): callAPI('POST', '128.194....', Array) #1 {main} 在 E:\xampp\ htdocs\3dprinter\server\api.php 在第 55 行我正在检查这些代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2011-04-17
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多