Php 在使用cURL将文件上载到使用httppost的restfulwebapi时指定目标数据库主体

Php 在使用cURL将文件上载到使用httppost的restfulwebapi时指定目标数据库主体,php,rest,curl,post,Php,Rest,Curl,Post,我正在尝试使用HTTPPOST和cURL将文件上传到RESTfulWebAPI。下面是我目前正在尝试的代码块。这样一来,除了一个问题之外,一切都正常工作,它将数据存储在默认的数据库主体中。我想将文件上传到用户当前使用的数据库主体。我需要知道两件事- 有没有办法在cURL头中指定在web服务器中使用哪个数据库主体,或者有任何cURL选项可供选择 指定该选项,以便cURL POST以所述方式上载数据 数据库负责人 我以前从未使用过cURL,通过httppost将使用多部分/表单数据的文件上传到re

我正在尝试使用HTTPPOST和cURL将文件上传到RESTfulWebAPI。下面是我目前正在尝试的代码块。这样一来,除了一个问题之外,一切都正常工作,它将数据存储在默认的数据库主体中。我想将文件上传到用户当前使用的数据库主体。我需要知道两件事-

  • 有没有办法在cURL头中指定在web服务器中使用哪个数据库主体,或者有任何cURL选项可供选择 指定该选项,以便cURL POST以所述方式上载数据 数据库负责人


  • 我以前从未使用过cURL,通过httppost将使用多部分/表单数据的文件上传到restfulwebapi是最好的选择吗

    for($i=0; $i<count($_FILES['files_to_upload']['name']); $i++) {
            if(!empty($_FILES['files_to_upload']['tmp_name'][$i])) {
                $ext = pathinfo($_FILES['files_to_upload']['name'][$i], PATHINFO_EXTENSION);
                $finfo = finfo_open(FILEINFO_MIME_TYPE);
                $mime = finfo_file($finfo, $_FILES['files_to_upload']['tmp_name'][$i]);
                $data_for_api = [
                    'rel_type'  => PROJECTS_REL_TYPE,
                    'rel_key'   => $ktr,
                    'category'  => $_POST['file_category'][$i],
                    'filename'  => $_POST['file_name'][$i].".".$ext,
                    'file-form-data'    => new CURLFile($_FILES['files_to_upload']['tmp_name'][$i],$mime,$_FILES['files_to_upload']['tmp_name'][$i]),
                    'description'   => $_POST['file_name'][$i],
                    'uploader'  => $this->session->userdata(RESNR)
                ];
    
                $ch = curl_init(INTERNAL_API_URL.POST_A_FILE);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data_for_api);
                if(!curl_exec($ch)) {
                    echo curl_error($ch);
                } 
                curl_close($ch);
            }
    }
    
    对于($i=0;$i项目\u REL\u类型,
    “rel_key”=>ktr美元,
    'category'=>$\u POST['file\u category'][$i],
    'filename'=>$\u POST['file\u name'][$i]。“..$ext,
    “文件格式数据”=>新建卷发文件($\u文件['FILES\u to\u upload']['tmp\u name'][$i],$mime,$\u文件['FILES\u to\u upload']['tmp\u name'][$i]),
    'description'=>$\u POST['file\u name'][$i],
    'uploader'=>$this->session->userdata(RESNR)
    ];
    $ch=curl\u init(内部API\u URL.POST\u文件);
    卷曲设置($ch,卷曲设置桩,1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data_for_api);
    如果(!curl_exec($ch)){
    回波旋度误差($ch);
    } 
    卷曲关闭($ch);
    }
    }
    

这里确实有两个问题,这不是一个很好的堆栈溢出格式,但我将回答这两个问题,因为到目前为止,您的经历非常痛苦:

是否有一种方法可以指定在cURL头中的web服务器中使用哪个数据库主体,或者是否有任何cURL选项可以指定,以便cURL POST将数据上传到所提到的数据库主体中

对此的一般回答是“否”。CURL对您的数据库一无所知,只会说HTTP。HTTP协议与数据库及其用户没有直接关系。这并不意味着这是不可能的,但这是在“每个应用程序”和服务器端定义的

您的服务器端API需要提供一种方法来做到这一点。只有在该API做到这一点后,才可以使用CURL来利用该功能。但对此没有“通用答案”


我以前从未使用过cURL,通过httppost将使用多部分/表单数据的文件上传到restfulwebapi是最好的选择吗

for($i=0; $i<count($_FILES['files_to_upload']['name']); $i++) {
        if(!empty($_FILES['files_to_upload']['tmp_name'][$i])) {
            $ext = pathinfo($_FILES['files_to_upload']['name'][$i], PATHINFO_EXTENSION);
            $finfo = finfo_open(FILEINFO_MIME_TYPE);
            $mime = finfo_file($finfo, $_FILES['files_to_upload']['tmp_name'][$i]);
            $data_for_api = [
                'rel_type'  => PROJECTS_REL_TYPE,
                'rel_key'   => $ktr,
                'category'  => $_POST['file_category'][$i],
                'filename'  => $_POST['file_name'][$i].".".$ext,
                'file-form-data'    => new CURLFile($_FILES['files_to_upload']['tmp_name'][$i],$mime,$_FILES['files_to_upload']['tmp_name'][$i]),
                'description'   => $_POST['file_name'][$i],
                'uploader'  => $this->session->userdata(RESNR)
            ];

            $ch = curl_init(INTERNAL_API_URL.POST_A_FILE);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data_for_api);
            if(!curl_exec($ch)) {
                echo curl_error($ch);
            } 
            curl_close($ch);
        }
}
一般来说,RESTful api有几种实现文件上传的方法。如果您只控制客户端而不控制服务器,那么这是否是最佳选择并不重要。REST api将定义上传的工作方式,您需要使用这种方法

如果同时控制服务器和客户端,最好不要使用
multipart/form data
,而是使用
PUT
请求,并直接创建新资源,而不是将它们包装在form/post请求中


无论如何,如果您正在编写服务器和客户机,并且想了解更多关于这些答案的信息,请关闭此问题并打开两个新问题。

@fabrik我没有问如何使用curl和PHP上载文件。我想知道一些完全不同的东西。|
使用curl使用HTTP POST将文件上载到RESTful Web API
你应该
curl\u close()
无论
curl\u exec()
成功与否。curl(嗯,HTTP)不知道远程服务器在数据到达服务器时对数据做了什么。数据存储在哪里(例如,在哪个数据库中)完全由服务器脚本控制。这不是HTTP的某些固有功能,因此它没有头或任何东西。HTTP不知道数据库,也不关心-大多数HTTP请求不涉及数据库。如果您调用的服务器方法选择在POST中接受参数值,允许您指定选项,如是的,那么这是唯一的方法。就像任何其他参数值一样。“通过HTTP POST将使用多部分/表单数据的文件上载到RESTful WEB API是最好的选择吗?”…这是一种非常标准的方法,但您首先必须检查服务器希望以何种格式接收数据。它总是希望您执行其他操作。同样,没有“这总是正确的”回答,这取决于响应HTTP请求的代码是如何实现的。如果您没有编写该代码,请与编写代码的人员联系,或者查阅他们提供的文档(如果他们提供了)。