PHP POST API файл не получен - PullRequest
0 голосов
/ 19 мая 2019

Наша команда работает над созданием веб-приложения для удаленного доступа к 3D-принтеру на PHP. Мы попытались реализовать часть print_job POST, используя multipart / form-data, но она не работает, что показывает отсутствие файла. Этот API будет проверять идентификатор и ключ. Вот код Любая помощь приветствуется!

Работает на 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)
);

1 Ответ

0 голосов
/ 19 мая 2019

Во-первых, не устанавливайте заголовок Content-Type:multipart/form-data вручную, потому что вы нарушите границу, если вы это сделаете.полный заголовок выглядит примерно так:

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

, поэтому удалите его:

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

и позвольте curl установить его для вас.(curl автоматически установит этот заголовок с правильной границей при установке CURLOPT_POSTFIELDS в массив.)

секунда, вы не отправляете фактический файл здесь, вы просто отправляете буквальную строку

new \CURLFile(realpath($filedata))

.. если вы хотите отправить файл, на который указывает $ filedata, вместо этого сделайте

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

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...