curl — загрузить файл на мой сервер Owncloud с помощью переполнения стека

Недавно я создал свой сервер owncloud, и мне нужно иметь возможность загружать файл из формы php, который передает файл с моего компьютера на мой сервер owncloud. Поэтому я попытался использовать Curl, вот так:

<?php
$url = "5.25.9.14/remote.php/webdav/plus.png";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // -X PUT
curl_setopt($ch, CURLOPT_USERPWD, "root:root"); // --user
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'img/plus.png' => '@'.realpath('img/plus.png')
)
);
$output = curl_exec($ch);
curl_close($ch);
?>

Я был вдохновлен эта почта и эта команда:

curl -X PUT "http://server.com/owncloud/remote.php/webdav/file.zip" --data-binary @"/Users/Root/Downloads/file.zip"

Командная строка, он работает, но не мой php. Мне удалось загрузить файл, но файл поврежден, и я не знаю почему: /. Может я скучаю по типу MIME? Достаточно ли получить поврежденный файл?

Вы видите, где я не прав?
С наилучшими пожеланиями, Zed13

Редактировать: когда я создаю файл из моего загруженного файла, он имеет тип данных, а не png, странно …

3

Решение

У меня также была проблема с загрузкой в ​​owncloud. Были те же симптомы, командная строка curl работает, но не вызов PHP curl.

Благодаря вашему посту я смог заставить его работать. Вот что у меня работает

// upload backup
$file_path_str = '/tmp/' . date('Ymd') . '.tar.gz';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://server/remote.php/webdav/backups/' . basename($file_path_str));
curl_setopt($ch, CURLOPT_USERPWD, "user:pass");
curl_setopt($ch, CURLOPT_PUT, 1);

$fh_res = fopen($file_path_str, 'r');

curl_setopt($ch, CURLOPT_INFILE, $fh_res);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file_path_str));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary

$curl_response_res = curl_exec ($ch);
fclose($fh_res);

Различия:

  • CURLOPT_PUT вместо CURLOPT_CUSTOMREQUEST
  • CURLOPT_INFILE а также CURLOPT_INFILESIZE вместо CURLOPT_POSTFIELDS

Спасибо за вашу помощь.
//

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]