【发布时间】: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] => application/octet-stream -
这很可怜:
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false)