首页 > 解决方案 > PHP cURL 仅创建空文件名(0 字节) - 不传输实际文件

问题描述

我正在使用文件类型输入通过 Ajax 将 FormData ($_FILES['files']) 传递给 PHP

我的 PHP cURL 如下所示:

$headers = array(
    "Authorization: Bearer " . <token>, 
    "Host: graph.microsoft.com",
    "Content-Type: multipart/form-data",
    "Content-Length: 0",
);

$filename = $_FILES['file']['name'];

$postfile = curl_init('https://graph.microsoft.com/v1.0/users/' . <userid> . '/drive/root:/<folder>/' . $filename . ':/content'); 
curl_setopt($postfile, CURLOPT_PUT, 1);
curl_setopt($postfile,CURLOPT_HEADER,false);
curl_setopt($postfile, CURLOPT_HTTPHEADER, $headers);
curl_setopt($postfile,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($postfile,CURLOPT_SSL_VERIFYHOST,0);

$result = curl_exec($postfile);
curl_close($postfile); 

这会在用户 OneDrive 的正确文件夹中创建一个具有正确扩展名和所有内容的文件,但它们都是空的(0 字节)。

我已经用许多不同类型的文件测试了几个小时,它总是一样的。

我哪里错了?

标签: phpcurlazure-ad-graph-apiform-datamicrosoft-graph-files

解决方案


我终于用以下方法解决了它:

    $filename = $_FILES['file']['name'];
    $filecon = fopen($_FILES['file']['tmp_name'],'r');
    $filesize = filesize($_FILES['file']['tmp_name']);

    $headers = array(
        "Authorization: Bearer " . <token>, 
        "Host: graph.microsoft.com",
        "Content-Type: application/json",
        "Content-Length: " . $filesize,
    );

    $postfile = curl_init('https://graph.microsoft.com/v1.0/users/' . <userid> . '/drive/root:/<folder>/' . $filename . ':/content'); 
    
    curl_setopt($postfile, CURLOPT_PUT, 1);
    curl_setopt($postfile,CURLOPT_HEADER,0);
    curl_setopt($postfile, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($postfile, CURLOPT_UPLOAD, 1);
    curl_setopt($postfile, CURLOPT_INFILE, $filecon);
    curl_setopt($postfile, CURLOPT_INFILESIZE, $filesize);

    $result = curl_exec($postfile);
    curl_close($postfile); 

希望这可以帮助任何寻找 PHP cURL 上传到 OneDrive 的人!


推荐阅读