Отправить непустой файл в Dspace с помощью Curl

#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;
        }
    }
 

Опубликованные файлы с правильным размером (наконец)
введите описание изображения здесь

Данные формы, которые я отправляю почтальоном, не нужно использовать путь к полю введите описание изображения здесь