我正在尝试使用HTTP POST和cURL将文件上传到RESTful WEB API。以下是我目前正在尝试的代码块。有了这个,除了一个问题之外,一切都可以正常工作,它将数据存储在默认数据库主体中。我想要的是将文件上传到用户当前使用的数据库主体。我需要知道两件事——
-
有没有办法在 cURL 标头中指定要在 Web 服务器中使用的数据库主体,或者是否有任何可用于 cURL 的选项 指定,以便 cURL POST 上传上述数据 数据库主体?
-
我以前从未使用过cURL,通过HTTP POST使用multipart/form-data将文件上传到RESTful WEB API是最佳选择吗?
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); } }
这里确实有 2 个问题,这不是堆栈溢出的好格式,但我会回答这两个问题,因为到目前为止您的经历非常痛苦:
有没有办法在 cURL 标头的 Web 服务器中指定要使用的数据库主体,或者是否有任何 cURL 选项可用于指定,以便 cURL POST 在提到的数据库主体中上传数据?
对此的一般答案是"不"。CURL对你的数据库一无所知,只说HTTP。HTTP 协议与数据库及其用户没有直接关系。这并不意味着这是不可能的,但这是"每个应用程序"和服务器端定义的。
您的服务器端 API 需要提供一种方法来执行此操作。只有当该 API 执行此操作时,CURL 才可能用于利用该功能。但对此没有"一般答案"。
我以前从未使用过cURL,通过HTTP POST使用multipart/form-data将文件上传到RESTful WEB API是最佳选择吗?
通常,RESTful api 有几种实现文件上传的方法。如果您只控制客户端而不是服务器,那么它是否是最佳选择并不重要。REST API 将定义上传的工作方式,您需要使用该方法。
如果您同时控制服务器和客户端,最好不要使用multipart/form-data
,而是改用PUT
请求并直接创建新资源,而不是将它们包装在表单/发布请求中。
无论如何,如果您同时编写服务器和客户端并想了解有关这些答案的更多信息,请关闭此问题并打开 2 个新答案。