Search code examples
phpcurluploadserverowncloud

Upload a file on my Owncloud server with PHP


Recently I created my owncloud server and I need to be able to upload a file from a php form which transfer an file from my pc to my owncloud server. So I tried to use Curl, like this :

<?php
    $url = "5.25.9.14/remote.php/webdav/plus.png";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // -X PUT
    curl_setopt($ch, CURLOPT_USERPWD, "root:root"); // --user
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary
    curl_setopt($ch, CURLOPT_POST,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, array(
        'img/plus.png' => '@'.realpath('img/plus.png')
        )
    );
    $output = curl_exec($ch);
    curl_close($ch);
?>

I have been inspire by this post and this command :

curl -X PUT "http://server.com/owncloud/remote.php/webdav/file.zip" --data-binary @"/Users/Root/Downloads/file.zip"

The command line, he's working but not my php. I succeed to upload the file but the file is corrupted and I don't know why :/. Maybe I miss the MIME type ? Is it enough to get a corrupted file ?

Do you see where I am wrong ? Best regards, Zed13

Edit : When I make an file of my uploaded file, it's of type data and not png, strange...


Solution

  • I was having an issue with an upload to owncloud as well. Had the same symptoms, the command line curl works, but not the PHP curl call.

    Thanks to your post I was able to get it working. Here is what works for me

    // upload backup
    $file_path_str = '/tmp/' . date('Ymd') . '.tar.gz';
    
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, 'http://server/remote.php/webdav/backups/' . basename($file_path_str));
    curl_setopt($ch, CURLOPT_USERPWD, "user:pass");
    curl_setopt($ch, CURLOPT_PUT, 1);
    
    $fh_res = fopen($file_path_str, 'r');
    
    curl_setopt($ch, CURLOPT_INFILE, $fh_res);
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file_path_str));
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); // --data-binary
    
    $curl_response_res = curl_exec ($ch);
    fclose($fh_res);
    

    The differences are:

    • CURLOPT_PUT instead of CURLOPT_CUSTOMREQUEST
    • CURLOPT_INFILE and CURLOPT_INFILESIZE instead of CURLOPT_POSTFIELDS

    Thanks for your help. //