如何在 PHP 中使用 POST 表单数据上传文件?

How to upload files with POST form-data in PHP?

正常的 curl 方式,效果很好。

curl \
  -F "smfile=@test.png" \
  -H "Content-Type: multipart/form-data" \
  https://sm.ms/api/v2/upload

但在我的 PHP 版本 curl 中,它 returns bool(false)string(0) "":

<?php

$url = "https://sm.ms/api/v2/upload";
$headers = array();
array_push($headers, "Content-Type: multipart/form-data");
array_push($headers, "User-Agent: ".$_SERVER['HTTP_USER_AGENT']);

// $fields = array('smfile' => curl_file_create('test.png', 'image/png', 'test.png'));
$fields = array('smfile' => new CURLFile('test.png', 'image/png', 'tset.png'));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

var_dump(curl_exec($ch));
var_dump(curl_error($ch));

我的代码有什么问题? ヽ(*。>Д<)o゜

您可以使用这个简单的代码来上传文件

$explode = explode('.', $_FILES['file']['name']);
$ext = $explode[count($explode) - 1];

if(is_uploaded_file($_FILES['file']['tmp_name']))
{
$result = move_uploaded_file($_FILES['file']['tmp_name'],
'uploads/'.basename($_FILES['file']['name']));
echo $result === true ? 'File uploaded successfuly' : 'There are some errors';
}
else
{
echo 'No File uploaded';
}

试试这个:

<?php

$url = "https://sm.ms/api/v2/upload";

// I guess the file is in the same directory as this script
$file = __DIR__.'/test.png'; 

$headers = [
    'Content-Type: multipart/form-data',
    'User-Agent: '.$_SERVER['HTTP_USER_AGENT'],
];

$fields = [
    'smfile' => new CURLFile($file, 'image/png')
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

var_dump(curl_exec($ch));
var_dump(curl_error($ch));

?>