如何在php中通过curl正确上传文件

问题描述 投票:0回答:1

我有以下curl命令来自

链接来源

curl -sSLX POST 'https://file-scan.aws.us.pangea.cloud/v1/scan' \
-H 'Authorization: Bearer my-token-goes here' \
-H 'Content-Type: multipart/form-data' \
-F 'request={"transfer_method":"multipart"};type=application/json' \
-F '[email protected];type=application/octet-stream'

现在我需要在 php 中编写curl,以便按照下面的代码上传文件

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://file-scan.aws.us.pangea.cloud/v1/scan');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer my-token-goes-here',
    'Content-Type: multipart/form-data',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'request' => '{"transfer_method":"multipart"}',
    'upload' => new CURLFile('AnnBall.png', 'application/octet-stream'),
]);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

echo $response = curl_exec($ch);

curl_close($ch);

?>

这是我遇到的错误

{“request_id”:“prq_nxj6w7ws5ussjsniphkzk7i3pqlf5peu”,“request_time”:“2024-04-25T17:15:00.638627Z”,“response_time”:“2024-04-25T17:15:01.722276Z”,“状态":"无效正文错误","summary":"无法读取请求正文","result":null}

有人可以帮我解决这个问题吗

php
1个回答
0
投票

您的代码存在一些可能存在的问题

  1. 使用

    multipart/form-data
    时,请确保为
    CURLOPT_POSTFIELDS
    选项传递字符串而不是数组。如果传递数组,PHP 会自动将数组编码为
    multipart/form-data
    格式,但在这种情况下它无法正确处理嵌套数据。因此,您需要手动构建多部分主体。

  2. 请确保文件路径“AnnBall.png”正确并且可以从您的 PHP 脚本访问。

这是您可以尝试的工作代码:

<?php

// Endpoint URL
$url = 'https://file-scan.aws.us.pangea.cloud/v1/scan';

// Request headers
$headers = [
    'Authorization: Bearer YOUR_ACCESS_TOKEN', // Replace YOUR_ACCESS_TOKEN with your actual token
    'Content-Type: multipart/form-data'
];

// Request data
$data = [
    'request' => json_encode(["transfer_method" => "multipart"]),
    'upload' => new CURLFile('AnnBall.png', 'application/octet-stream', 'upload')
];

// Initialize cURL session
$ch = curl_init();

// Set cURL options
curl_setopt_array($ch, [
    CURLOPT_URL => $url,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $data,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false, // Note: set to true in production for better security
]);

// Execute the request
$response = curl_exec($ch);

// Check for errors
if ($response === false) {
    echo 'cURL error: ' . curl_error($ch);
}

// Close cURL session
curl_close($ch);

// Output response
echo $response;

?>

这是上述代码的简单解释

我使用

curl_setopt_array
功能一次设置多个选项,并且我还使用
curl_file_create
功能来管理文件上传。

© www.soinside.com 2019 - 2024. All rights reserved.