指定目标数据库主体,同时使用 cURL 通过 HTTP POST 将文件上传到 RESTful Web API



我正在尝试使用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 个新答案。

最新更新