Image::Magick->Write() doesn't want to write

D

Dave Griffith

I can't seem to get a CGI script that's supposed to do quick-and-dirty
conversions of any image into a png. My problem is that
$magick_image->Write('$upload_dir/$outfile'); never seems to output
anything. The script is essentially a copy of
http://articles.sitepoint.com/article/uploading-files-cgi-perl/ with
PerlMagick tacked on. Please help.

Here's the script:

#!/usr/bin/perl -wT

use strict;
use CGI;
use CGI::Carp qw ( fatalsToBrowser );
use File::Basename;
use Image::Magick;

$CGI::pOST_MAX = 1024 * 5000;
my $safe_filename_characters = "a-zA-Z0-9_.-";
my $upload_dir = "/var/www/tmp";

my $query = new CGI;
my $filename = $query->param("image");
my $email_address = $query->param("email_address");

if ( !$filename ) {
print $query->header ( );
print "There was a problem uploading your image (try a smaller file).";
exit;
}

my ( $name, $path, $extension ) = fileparse ( $filename, '\..*' );
$filename = $name . $extension;
$filename =~ tr/ /_/;
$filename =~ s/[^$safe_filename_characters]//g;

if ( $filename =~ /^([$safe_filename_characters]+)$/ ){
$filename = $1;
}
else{
die "Filename contains invalid characters";
}

my $upload_filehandle = $query->upload("image");

open ( UPLOADFILE, ">$upload_dir/$filename" )
or die "$! Cannot write to $upload_dir/$filename";

binmode UPLOADFILE;

while ( <$upload_filehandle> )
{
print UPLOADFILE;
}

close UPLOADFILE;

###################
# Image Conversion
###################

my $magick_image = Image::Magick->new();
my $outfile = $filename;
my $status;

$outfile =~ s/\..*$//g;
$outfile = $outfile . ".png";

open(IMAGE, '$upload_dir/$filename');
$magick_image->Read('$upload_dir/$filename');
$magick_image->Write('$upload_dir/$outfile');
close(IMAGE);


print $query->header ( );
print <<END_HTML;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Your Converted Image</title>
<style type="text/css">
img {border: none;}
</style>
</head>
<body>
<p>Here is your original image</p>
<p><img src="/tmp/$filename" alt="Original Image" /></p>
<p>Here is your converted image</p>
<p><img src="/tmp/$outfile" alt="Converted Image" /></p>
</body>
</html>
END_HTML
 
D

Danny Woods

I can't seem to get a CGI script that's supposed to do quick-and-dirty
conversions of any image into a png. My problem is that

open(IMAGE, '$upload_dir/$filename');
$magick_image->Read('$upload_dir/$filename');
$magick_image->Write('$upload_dir/$outfile');
close(IMAGE);

If that script is accurate, you're going to have a problem with (at
least) these lines. The single quotes prevent variable interpolation,
so you're trying to read and write files literally named
$upload_dir/$filename, $upload_dir/$outfile, etc. You'll have more luck
if you change these to double quotes, or, as an example,
sprintf('%s/%s', $upload_dir, $filename).

Cheers,
Danny.
 
D

Dave Griffith

Danny Woods said:
(e-mail address removed) (Dave Griffith) writes:
If that script is accurate, you're going to have a problem with (at
least) these lines. The single quotes prevent variable interpolation,
so you're trying to read and write files literally named
$upload_dir/$filename, $upload_dir/$outfile, etc. You'll have more luck
if you change these to double quotes, or, as an example,
sprintf('%s/%s', $upload_dir, $filename).

Thanks. I was fiddling around with this for an hour. Argh!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top