代码之家  ›  专栏  ›  技术社区  ›  Georgi Kovachev

Dropbox API v2 PHP上载文件问题

  •  9
  • Georgi Kovachev  · 技术社区  · 8 年前

    我正在尝试使用Dropbox API v2上载文件。 不幸的是,Dropbox API v2没有PHP库。

    https://www.dropbox.com/developers/documentation/http/documentation#files-upload

    这是我的代码:

    $token = 'sometoken'; // oauth token
    
    $headers = array("Authorization: Bearer ". $token,
        'Dropbox-API-Arg: {"path": "/test.txt","mode": "add","autorename": true,"mute":false}',
        "Content-Type: application/octet-stream");
    
    
    $url = 'https://content.dropboxapi.com/2/files/upload';
    
    $ch = curl_init($url);
    
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, true);
    
    $path = './google/file.json';
    $fp = fopen($path, 'rb');
    curl_setopt($ch, CURLOPT_INFILE, $fp);
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($path));
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    
    //curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    
    
    $response = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo($response.'<br/>');
    echo($http_code.'<br/>');
    
    curl_close($ch);
    echo $response;
    

    它创建测试。txt但0字节。 当我检查代码时,它读取0字节。

    这是代码执行的输出:

    *   Trying 45.58.74.164...
    * Connected to content.dropboxapi.com (45.58.74.164) port 443 (#0)
    * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
    * successfully set certificate verify locations:
    *   CAfile: C:\xampp\php\extras\ssl\cacert.pem
      CApath: none
    * NPN, negotiated HTTP1.1
    * SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
    * Server certificate:
    *  subject: OU=Domain Control Validated; CN=dl.dropboxusercontent.com
    *  start date: Jul  9 01:10:38 2016 GMT
    *  expire date: May  7 20:27:38 2017 GMT
    *  subjectAltName: host "content.dropboxapi.com" matched cert's "content.dropboxapi.com"
    *  issuer: C=US; ST=Arizona; L=Scottsdale; O=GoDaddy.com, Inc.; OU=http://certs.godaddy.com/repository/; CN=Go Daddy Secure Certificate Authority - G2
    *  SSL certificate verify ok.
    > POST /2/files/upload HTTP/1.1
    Host: content.dropboxapi.com
    Accept: */*
    Authorization: Bearer sometoken
    Dropbox-API-Arg: {"path": "/test.txt","mode": "add","autorename": true,"mute":false}
    Content-Type: application/octet-stream
    Expect: 100-continue
    
    < HTTP/1.1 100 Continue
    < HTTP/1.1 200 OK
    < Server: nginx
    < Date: Thu, 15 Sep 2016 13:37:16 GMT
    < Content-Type: application/json
    < Transfer-Encoding: chunked
    < Connection: keep-alive
    < pragma: no-cache
    < cache-control: no-cache
    < X-Server-Response-Time: 461
    < X-Dropbox-Request-Id: 7b0003052a45a92fac0e7afca80f4f4c
    < X-Robots-Tag: noindex, nofollow, noimageindex
    <
    * Connection #0 to host content.dropboxapi.com left intact
    {"name": "test.txt", "path_lower": "/test.txt", "path_display": "/test.txt", "id": "id:L2W5zzeox5IAAAAAAAAjvg", "client_modified": "2016-09-15T13:37:16Z", "server_modified": "2016-09-15T13:37:16Z", "rev": "ee6e21bf2e5c", "size": 0}<br/>200<br/>{"name": "test.tx
    t", "path_lower": "/test.txt", "path_display": "/test.txt", "id": "id:L2W5zzeox5IAAAAAAAAjvg", "client_modified": "2016-09-15T13:37:16Z", "server_modified": "2016-09-15T13:37:16Z", "rev": "ee6e21bf2e5c", "size": 0}
    
    2 回复  |  直到 8 年前
        1
  •  9
  •   Georgi Kovachev    8 年前

    我找到了答案。

    $api_url = 'https://content.dropboxapi.com/2/files/upload'; //dropbox api url
            $token = 'some value'; // oauth token
    
            $headers = array('Authorization: Bearer '. $token,
                'Content-Type: application/octet-stream',
                'Dropbox-API-Arg: '.
                json_encode(
                    array(
                        "path"=> '/'. basename($filename),
                        "mode" => "add",
                        "autorename" => true,
                        "mute" => false
                    )
                )
    
            );
    
            $ch = curl_init($api_url);
    
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_POST, true);
    
            $path = $filename;
            $fp = fopen($path, 'rb');
            $filesize = filesize($path);
    
            curl_setopt($ch, CURLOPT_POSTFIELDS, fread($fp, $filesize));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //        curl_setopt($ch, CURLOPT_VERBOSE, 1); // debug
    
            $response = curl_exec($ch);
            $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            echo($response.'<br/>');
            echo($http_code.'<br/>');
    
            curl_close($ch);
    
        2
  •  6
  •   Graham francescalus    7 年前

    在PHP中使用curl以Dropbox API期望的方式格式化HTTP请求可能有点棘手。因此,不是:

    curl_setopt($ch, CURLOPT_POST, true);
    

    使用此选项:

    curl_setopt($ch, CURLOPT_PUT, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    

    这里有一个例子:

    $path = 'test_php_upload.txt';
    $fp = fopen($path, 'rb');
    $size = filesize($path);
    
    $cheaders = array('Authorization: Bearer <ACCESS_TOKEN>',
                      'Content-Type: application/octet-stream',
                      'Dropbox-API-Arg: {"path":"/test/'.$path.'", "mode":"add"}');
    
    $ch = curl_init('https://content.dropboxapi.com/2/files/upload');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $cheaders);
    curl_setopt($ch, CURLOPT_PUT, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_INFILE, $fp);
    curl_setopt($ch, CURLOPT_INFILESIZE, $size);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    
    echo $response;
    curl_close($ch);
    fclose($fp);
    
    ?>
    

    <ACCESS_TOKEN> 应替换为OAuth 2访问令牌。