#json #yii2 #postman #php-curl #dspace
#json #yii2 #почтальон #php-curl #dspace
Вопрос:
Я отправляю файл в dspace через dspace api, я делаю это с помощью действия в php. С помощью postman я отправляю данные формы с файлом, именем файла, идентификатором потока битов и токеном.
Я получаю путь к временному файлу с помощью $ _FILES и отправляю его с помощью опции postfields curl, но файл загружается пустым или со странными данными, без его содержимого.
public function actionSubirBitstream()
{
if (Yii::$app->request->isPost) {
$body = $_POST;
$prefijo = '/rest/items/';
$host = ConfiguracionDspace::find()->where("clave='host'")->one()->valor;
$puerto = ConfiguracionDspace::find()->where("clave='puerto'")->one()->valor;
$token = $body['token'];
$id = $body['id'];
$final = '/bitstreams';
$name = $body['name'];//nombre del archivo sin espacios
$params = "?name=$name";
$url = $host . ':' . $puerto . $prefijo . $id . $final . $params;
$file = $_FILES['file']['tmp_name'];
//$path = $body['path'];
//$file = new CURLFILE("$path");
$headers = array("Content-Type: application/json", 'Accept: application/json', "rest-dspace-token: " . $token);
$curl = curl_init($url);
$options = array(
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => array('file'=> $file,'name' => $name),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $headers
);
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
}
Комментарии:
1. Вы пробовали использовать yiiwebUploadedFile для извлечения файлов?
2. Я не пробовал, но у меня нет созданной модели, поэтому я просто хотел сделать это с помощью $ _FILES, мне нужен только путь к файлу, я думаю, но это работает неправильно
3. Я думаю, что информация о $ _FILES содержит больше информации в Yii2. Здесь взгляните на реализацию loadFiles в UploadedFile: github.com/yiisoft/yii2/blob /…
4. Мне нужен был только временный путь к файлу, вот что я получаю от
$file = $_FILES['file']['tmp_name'];
Спасибо в любом случае
Ответ №1:
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array('photo'=> new CURLFILE('/C:/Users/pfile3.jpeg'),'name' => $name),
это пример загрузки файла с ключом формы в виде фотографии и другим именем ключа
на снимке экрана у вас есть идентификатор и токен в данных формы, но в коде его нет внутри POSTFIELDS
в postman вы можете сгенерировать эквивалентный код запроса на любом языке, попробуйте сгенерировать эквивалентный код PHP и посмотреть, работает ли он:
Для этого просто нажмите ссылку code под URL-адресом запроса после сохранения запроса
Ответ №2:
Я уже отправил файл с помощью переменной $ _FILE, но мне нужно было использовать CURLFILE для создания нового файла и указать ему временный путь к файлу на сервере $file = $_FILES['file']['tmp_name'];
, а это в полях post CURLOPT_POSTFIELDS => array('file'=> new CURLFile("$file"),'name' => $name),
Спасибо за помощь друзья
Здесь код:
public function actionSubirBitstream()
{
if (Yii::$app->request->isPost) {
$body = $_POST;
$prefijo = '/rest/items/';
$host = ConfiguracionDspace::find()->where("clave='host'")->one()->valor;
$puerto = ConfiguracionDspace::find()->where("clave='puerto'")->one()->valor;
$token = $body['token'];
$id = $body['id'];
$final = '/bitstreams';
$name = $body['name'];//nombre del archivo sin espacios
$params = "?name=$name";
$url = $host . ':' . $puerto . $prefijo . $id . $final . $params;
$file = $_FILES['file']['tmp_name'];
//$path = $body['path'];
//$file = new CURLFILE("$path");
$headers = array("Content-Type: application/json", 'Accept: application/json', "rest-dspace-token: " . $token);
$curl = curl_init($url);
$options = array(
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => array('file'=> new CURLFile("$file"),'name' => $name),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $headers
);
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
}
Опубликованные файлы с правильным размером (наконец)
Данные формы, которые я отправляю почтальоном, не нужно использовать путь к полю