views:

312

answers:

3

I have a web-application that allow users to upload images to my web site.

What I want to do is instead of hosting those images myself, I want to push those images off to my CDN (Cachefly).

Using PHP, I want to FTP an image from my server to another whenever a user uploads an image to my server.

However, I want to maintain the file structure path of my current server. Meaning, the file system plan locally is:

local:  upload/YYYY/MM/DD/uniquefilename.jpg

So I want on my CDN for the image to be uploaded to:

cdn:  upload/YYYY/MM/DD/uniquefilename.jpg

The problem is that the directory /YYYY/MM/DD might exist, or might not.

I'm using the following PHP code but this does not create the directories (/YYYY/MM/DD) when they are not currently present.

How do I FTP an image to a remote server while also maintain the file structure?

<?php
// set up basic connection
$conn_id = ftp_connect($ftp_server); 

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 

// check connection
if ((!$conn_id) || (!$login_result)) { 
        echo "FTP connection has failed!";
        echo "Attempted to connect to $ftp_server for user $ftp_user_name"; 
        exit; 
    } else {
        echo "Connected to $ftp_server, for user $ftp_user_name";
    }

// upload the file
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY); 

// check upload status
if (!$upload) { 
        echo "FTP upload has failed!";
    } else {
        echo "Uploaded $source_file to $ftp_server as $destination_file";
    }

// close the FTP stream 
ftp_close($conn_id); 
?>
+1  A: 

Why don't you Google for ftp_mkdir? (It was the first thing I tried and yes, its manual page is the first result.)

reinierpost
But how do I check for the existence of the directory before I try creating it?
VictorH
You don't. You just try to create it (and its ancestors, if necessary).
reinierpost
+1  A: 

You could implicitely try and create the directory before uploading the image (with error suppression):

// assume you used substr() on your $destination_file to get the directory
// and named that variable $destination_dir
@ftp_mkdir($conn_id, $destination_dir);
cballou
If I try to create the directory and it DOES exist, what would happen?
VictorH
It'll fail, since there is already a directory there. Not a big deal. I wouldn't do it that way, myself, just because it might fail for more than one reason (e.g. you don't have permissions to create directories, or something.) Mind you, my "solution" isn't any better, so I guess I shouldn't complain.
Satanicpuppy
Would this be any easier if I used the PHP 'system(ftp...)' command?
VictorH
I would recommend not using the system() variable as it is far less secure to execute shell commands than to limit the command to a single mkdir().
cballou
Agree with not using system(); it doesn't get you anything, and it can cause issues.
Satanicpuppy
+1  A: 

I usually try to do an ftp_chdir, and if that fails, I try to make the directory with ftp_mkdir, and if that fails, I throw an error. Otherwise you're going to have to list the directories, catch the output, and parse it looking for the directory, and THEN try to do a ftp_mkdir.

Ugly hack, admittedly.

@Victor: Well, we ARE talking about php here. You can wrap it in a try/catch block if it makes you feel any better, but really it's going to be doing the same thing. Without a method to test the directory (which php doesn't have), you're going to have to do something like this.

If it makes you feel any better, I've never seen a php ftp script that did it any differently. Hell, code like that is on the ftp_mkdir manual page!

Satanicpuppy
Is there a non-hack way?
VictorH