Яндекс Диск. API - загрузка файлов
Пытаюсь отправить файл с формы на облако Яндекс диска. Я понимаю, о чём ошибка, но не понимаю, как исправить. Мне не нужно загружать файл сначала на свой сервер, а с него на Яндекс, нужно сразу с устройства юзера на Яндекс, как это и задумано изначально.
Форма:
<form method="post" action="file.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<input name="ff" type="file">
<input type="submit" value="отправить" name="uploadBtn">
</form>
PHP:
$token = 'TOKEN';
// Путь и имя файла на нашем сервере.
$fileName = $_FILES['ff']['name'];
$fileNameCmps = explode(".", $fileName);
$fileExtension = strtolower(end($fileNameCmps));
$file = md5(time() . $fileName) . '.' . $fileExtension;
echo $file;
// Папка на Яндекс Диске (уже должна быть создана).
$path = '/test/';
// Запрашиваем URL для загрузки.
$ch = curl_init('https://cloud-api.yandex.net/v1/disk/resources/upload?path=' . urlencode($path . basename($file)));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
$res = json_decode($res, true);
if (empty($res['error'])) {
// Если ошибки нет, то отправляем файл на полученный URL.
$fp = fopen($file, 'r');
$ch = curl_init($res['href']);
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file));
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 201) {
echo 'Файл успешно загружен.';
} else {
echo 'error2';
}
} else {
var_dump($res['error']);
}
В итоге я получаю такой ответ
Файл появялется на диске, но он некорректный, его нельзя открыть и посмотреть, но название, расширение передаются. Размер 0
Ответы (1 шт):
Автор решения: bdpapa
→ Ссылка
Файл получай из формы $fp = file_get_contents($_FILES['file']['tmp_name']);
и curl для записи используйте такой. Проверено, работает.
Форма:
<form method="post" action="yandex-file.php" enctype="multipart/form-data">
<input name="file" type="file">
<input type="submit" value="отправить" name="uploadBtn">
</form>
PHP:
if (empty($res['error'])) {
$fp = file_get_contents($_FILES['file']['tmp_name']);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $res['href']);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $fp);
$answer = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 201) {
echo 'Файл успешно загружен.';
} else {
echo 'error2';
}
} else {
var_dump($res['error']);
}
