RE: [PHP] Re: Automatic Download using URL, HELP!
| From: | Hankley, Chip | Date: | Mon, 26 Aug 2002 15:23:28 +0000 |
| Subject: | RE: [PHP] Re: Automatic Download using URL, HELP! | ||
| Groups: | php.general | ||
| Request: | Send a blank email to php-general+get-114147@lists.php.net to get a copy of this message | ||
Bogdan -
Sorry for the delay to your follow-up.
The total script is below... first let me explain a little more of what I'm
doing for clarity's sake.
I'm downloading a lot of data files from a site. The way the site works, you
supply some information in a form regarding the data set you want. This goes
to a PERL script which creates a packaged (zipped) data set and puts it in
an FTP directory.
What I wanted to do was write a script that would automatically do the form
submission, retrieve the name and location of the zip file, and save it to
my local hard disk. I happened to have a list of over 1000 data set names
that I wanted to get... so I just needed to loop through them.
FWIW, the "faking a form post" part of this, which is really the core of
what I'm doing, is based on the following in the pgp_general archives:
http://marc.theaimsgroup.com/?l=php-general&m=101899239727991&w=2
You can search for this by searching the archives for the term "asphttp".
ASPHTTP is a tool for ASP that does the same thing... only it costs money,
and this little function is free! How cool is that?
Here's the script (got it working, BTW).
Chip
<?
/*--- PHP Script --------------*/
$data = array("dataset1", "dataset2", ... , "dataset1000");
//Loop through each value in the array, POSTING data, and downloading
// the dataset to the hard drive.
foreach($data as $a) {
//Since this script is going to take a long time to execute
// we need to set the max time limit to some really high
// number so that it doesn't time out. This probably needs
// to be done on the web_server as well (e.g. the def time-out
// in IIS is 300 seconds).
set_time_limit(120000);
//The next two variables make up the location of the resource
// that you will be posting to. This is basically what would
// appear in the ACTION section of a FORM element. In this case:
// http://www.someserver.com/cgi-bin/some_script.pl
$host="www.someserver.com;
$path="/cgi-bin/some_script.pl";
//The next line makes up the 'data to send' in the form. Apparently
// if you start the string with a "&", this will use the POST method,
// while if you start with a "?" it will use the GET method (or at
// least it's acting like it's doing one or the other).
$data_to_send = "&myDataSetName=" . $a .
"&FormVar1=Value1&FormVar2=Value2";
PostToHost($host, $path, $data_to_send);
}
function PostToHost($host, $path, $data_to_send)
{
//This part of the function creates a file that essentially POSTs the
// $data_to_send information to the $host . $path location, and retrieves
// the information into a variable called $returnData
$returnData="";
$fp = fsockopen($host,80);
fputs($fp, "POST $path HTTP/1.1\n");
fputs($fp, "Host: $host\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
fputs($fp, "Content-length: ".strlen($data_to_send)."\n");
fputs($fp, "Connection: close\n\n");
fputs($fp, $data_to_send);
//Loop through the variable $returnData line-by-line. In this case,
// I'm searching for a keyword. The name of the resulting file is always
// on a line like this:
// YOURFTPFILENAME = some_file_name_xxxx.xxxx
//Once I hit this line, I want to save the entire line into a variable
// called $filename, and break out of the loop.
while(!feof($fp)) {
$returnData=fgets($fp, 128);
$filename = strstr($returnData, 'YOURFTPFILENAME');
if ($filename)
break;
}
//Use some simple string parsing functions to strip out the
"YOURFTPFILENAME = "
// part of the filename.
$filename = substr($filename, 18);
$filename = trim($filename);
//Now, I'm going to connect to and read the file that was created. In this
case
// it is always saved to the same location, so all I need to do is specify
the
// file name. The file will be read into a variable called $contents.
$host = "http://www.someserver.com/ftp_downloads/images/";
$fp2 = fopen($host . $filename, "rb+");
$contents = fread ($fp2, 25000000); //use some rediculously large number
in fread
// to ensure that you get the whole
thing.
//make a file to write to on the local system, and dump $contents into the
new
// file.
$fp3 = fopen("D:\\myFiles\\SomeDirectory\\" . $filename, "w");
fputs($fp3, $contents);
//close all of the documents
fclose($fp);
fclose($fp2);
fclose($fp3);
}
/*---- End of Script ---------------*/
?>
> -----Original Message-----
> From: Bogdan Stancescu [mailto:mgv@canad.ro]
> Sent: Thursday, August 22, 2002 10:29 PM
> To: php-general@lists.php.net
> Subject: [PHP] Re: Automatic Download using URL, HELP!
>
>
> Just out of curiousity, how did you ever get PHP to prompt you where to
> save a file? Could you post a more complete code sample?
>
> Bogdan