Caching product images locally can save your users several trips to the Amazon server and speed up your applications.
The easiest way to save an image locally is to visit the product detail page, right-click on the image, and choose "Save Picture As . . . ". Of course, "easy" is relative. If you have to do this for hundreds of products, suddenly it's the hard way.
Luckily, every programming environment has methods for retrieving an image from a remote server and saving it as a local file.
Each of these examples takes an ASIN, builds the proper URL [Hack #5], grabs the image, and saves it locally as [ASIN].jpg.
This uses the getstore( ) function of LWP::Simple to request and save the file. $rp is the return code, and to shore this function up you could take additional action if it's equal to 404.
use LWP::Simple;
$Asin = "0596004478";
$rp = getstore(
"http://images.amazon.com/images/P/$Asin.01.MZZZZZZZ.jpg",[RETURN]
"$Asin.jpg");
Writing binary files like images isn't quite as straightforward with VBScript, so you have to turn to some unusual components. The ServerXMLHTTP component makes the request, which is written to an ADODB stream. The ADODB component has the ability to write binary files.
strASIN = "0596004478" strURL = "http://images.amazon.com/images/P/" & strASIN & _ ".01.MZZZZZZZ.jpg" strFile = strASIN & ".jpg" 'Get the Image Set xmlhttp = CreateObject("Msxml2.SERVERXMLHTTP") xmlhttp.Open "GET", strURL, false xmlhttp.Send(Now) 'Create a Stream Set adodbStream = CreateObject("ADODB.Stream") 'Open the stream adodbStream.Open adodbStream.Type = 1 'adTypeBinary adodbStream.Write xmlhttp.responseBody adodbStream.SaveToFile strFile, 2 'adSaveCreateOverWrite adodbStream.Close Set adodbStream = Nothing Set xmlhttp = Nothing
This code will run as a WSH file. Simply add Server. before the CreateObject commands to use this code in an ASP file.
The key to this PHP code is setting the fopen( ) function to read and write binary files. Note the rb (read binary) and wb (write binary) options.
$asin = "0596004478"; $url = "http://images.amazon.com/images/P/".$asin.".01.MZZZZZZZ.jpg"; $filedata = ""; $remoteimage = fopen($url, 'rb'); if ($remoteimage) { while(!feof($remoteimage)) { $filedata.= fread($remoteimage,1024); } } fclose($remoteimage); $localimage = fopen($asin.".jpg", 'wb'); fwrite($localimage,$filedata); fclose($localimage);
As with PHP, be sure to set the file open command to wb (write binary) so it can save the file properly.
import urllib asin = "0596004478" url = 'http://images.amazon.com/images/P/' + asin + ".01.MZZZZZZZ.jpg" filedata = urllib.urlopen(url).read( ) f = open(asin + '.jpg', 'wb') f.write(filedata) f.close( )
|