php - 无法在 onehub.com API 上上传文件
问题描述
我正在尝试使用那里的 API 在 onehub.com 上上传文件。文档在这里
我已经用 curl 对其进行了编码,但未能上传图像
代码
fileUpload("/folders/123421/files",$_FILES['upload'], $data);
function fileUpload($url,$localFile,$token)
{
$size = $localFile['size'];
$boundary = hash('sha256', uniqid('', true));
$headers = [
'Authorization: Bearer ' . $token,
'content-type: multipart/form-data; boundary='.$boundary,
'content-length: '.$size
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://ws-api.onehub.com".$url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$args['file'] = new CurlFile($localFile['tmp_name'], $localFile['type'], $localFile['name']);
curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
$result = curl_exec($ch);
return $result;
}
我得到的错误是:couldn't open file "/tmp/phpItjbyg"
如果我改变这条线
$args['file'] = new CurlFile($localFile['tmp_name'], $localFile['type'], $localFile['name']);
至
$args['file'] = new CurlFile($localFile['name'], $localFile['type'], $localFile['name']);
它没有返回错误,但没有上传文件。
解决方案
它需要表单多部分内容,经过一些修改后我在这里找到了一些帮助,我修复了它并成功上传了文件。
代码:
fileUpload("/folders/123421/files",$_FILES['upload'], $data);
//
function buildMultiPartReq($ch, $boundary, $files, $token)
{
$delimiter = '-------------' . $boundary;
$data = '';
$data .= "--" . $delimiter . "\r\n"
. 'Content-Disposition: form-data; name="file"; filename="' . $files['name'] . '"' . "\r\n\r\n"
. $files['tmp_name'] . "\r\n";
$data .= "--" . $delimiter . "\r\n"
. 'Content-Disposition: form-data; name="type"; filename="' . $files['name'] . '"' . "\r\n\r\n"
. $files['type'] . "\r\n";
$data .= "--" . $delimiter . "\r\n"
. 'Content-Disposition: form-data; name="size"; filename="' . $files['name'] . '"' . "\r\n\r\n"
. $files['size'] . "\r\n";
$data .= "--" . $delimiter . "\r\n"
. 'Content-Disposition: form-data; name="content"; filename="' . $files['name'] . '"' . "\r\n\r\n"
. file_get_contents($files['tmp_name']) . "\r\n";
$headers = [
'Authorization: Bearer ' . $token,
'Content-Type: multipart/form-data; boundary=' . $delimiter
];
$data .= "--" . $delimiter . "--\r\n";
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $data
]);
return $ch;
}
function fileUpload($url, $localFile, $token)
{
$ch = curl_init("https://ws-api.onehub.com" . $url);
$ch = buildMultiPartReq($ch, uniqid(), $localFile, $token);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
return curl_error($ch);
}
推荐阅读
- c - const 对 C 字符串字面量数组的作用
- django - Django admin 显示由字段过滤的模型实例
- php - 警告:isset 中的偏移类型非法或为空
- r - gsub 函数的结果会失真。知道为什么吗?
- ios - IOS 如何使用 Parse Swift 为每个用户获取个人资料图片
- r - 在 rbind() 中将单元格值解析为行名
- vb.net - 调整多个图像的大小并将它们保存到单独的文件夹中
- java - XML反序列化后访问子列表抛出ConcurrentModificationException
- python - 在 Python 3 中,如何在排行榜中查找排名并将其转换为字典?
- google-app-engine - 子域通过 DNS 解析到不同的网站