Post 一个非空文件到 Dspace with Curl

Post a not empty file to Dspace with Curl

我正在通过 dspace api 将文件发布到 dspace,我正在 php 中执行此操作。通过邮递员,我发送了一个包含文件、文件名、比特流 ID 和令牌的表单数据。

我正在使用 $_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;
        }
    }

  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('photo'=> new CURLFILE('/C:/Users/pfile3.jpeg'),'name' => $name),

这是上传一个文件的例子,表单键是照片,另一个键名是

在您的屏幕截图中,您在表单数据中有 id 和标记,但在代码中它不在 POSTFIELDS 中

在 postman 中你可以生成任何语言的请求等价代码,尝试生成 PHP 等价代码,看看它是否有效:

要执行此操作,只需在保存请求 url 后单击请求 link 下的代码

我已经通过 $_FILE 变量 post 文件,但我需要做的是使用 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;
        }
    }

post 大小合适的文件(最终)

我用Postman发送的表单数据,不需要使用字段路径