PHP cURL:将文件从表单上传到远程API?

发布于 2024-11-16 06:44:32 字数 800 浏览 0 评论 0原文

我正在尝试在我的网站上上传表单上的文件,然后将其传递到远程 API。

这是我的 PHP:

$fields = array(
    'file'=>$_FILES["mediaupload"],
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
);
$fields_string = http_build_query($fields);
$url = my_url;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec ($ch);

目前我不断收到文件无法正确处理的错误消息。 API 期望所有字段都是 POST 字符串,但文件除外,它期望以二进制形式。

我知道在无法访问远程 API 的情况下,对你们来说调试这个会很困难,但是我是否做了任何明显错误的事情,或者这应该有效?

非常感谢。

I'm trying to upload a file on a form on my site, and then pass it on to a remote API.

This is my PHP:

$fields = array(
    'file'=>$_FILES["mediaupload"],
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
);
$fields_string = http_build_query($fields);
$url = my_url;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec ($ch);

At the moment I keep getting error messages that the file could not be processed properly. The API expects all fields as POST strings except the file, which it expects in binary.

I know it's going to be tough to debug this for you guys without access to the remote API, but am I doing anything obviously wrong, or should this work?

Many thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

2024-11-23 06:44:32

使用curl 上传文件不会像这样工作。您需要首先使用 php 的 move_uploaded_file 将文件保存在本地,然后获取文件的路径。在字段中添加此内容,

$fields = array(
    'file'=>"@/path/to/myfile.ext",
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
);

另外,
我不确定字段数组是否需要转换为字符串才能用作后字段。根据手册,它可以直接是一个 array() 。

CURLOPT_POSTFIELDS 完整数据
在 HTTP“POST”操作中发布。到
发布文件,在文件名前添加 @
并使用完整路径。文件类型
可以明确指定
文件名后跟类型
格式为“;type=mimetype”。这
参数可以作为
urlencoded 字符串就像
'para1=val1¶2=val2&...' 或作为
以字段名称作为键的数组
字段数据作为值。如果值是一个
数组,Content-Type 标头将是
设置为多部分/表单数据。从 PHP 开始
5.2.0,传递给此选项且带有 @ 前缀的文件必须位于
数组形式工作。

File upload using curl does not work like this. You need to first save the file locally using php's move_uploaded_file then get the path to file. In the fields add this,

$fields = array(
    'file'=>"@/path/to/myfile.ext",
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
);

Also,
I'm not sure if fields array needs to be converted to string to be used as postfields. According to manual it can be an array() directly.

CURLOPT_POSTFIELDS The full data to
post in a HTTP "POST" operation. To
post a file, prepend a filename with @
and use the full path. The filetype
can be explicitly specified by
following the filename with the type
in the format ';type=mimetype'. This
parameter can either be passed as a
urlencoded string like
'para1=val1¶2=val2&...' or as an
array with the field name as key and
field data as value. If value is an
array, the Content-Type header will be
set to multipart/form-data. As of PHP
5.2.0, files thats passed to this option with the @ prefix must be in
array form to work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文