summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/upload.pl192
1 files changed, 192 insertions, 0 deletions
diff --git a/bin/upload.pl b/bin/upload.pl
new file mode 100755
index 0000000..5927da0
--- /dev/null
+++ b/bin/upload.pl
@@ -0,0 +1,192 @@
+#!/usr/bin/perl
+
+use strict;
+use CGI::Carp qw(fatalsToBrowser);
+
+use DBI;
+use Digest::MD5;
+use File::MMagic;
+use CGI;
+use File::Slurp;
+use Data::Dumper;
+use Amazon::S3;
+use Digest::SHA1;
+
+#set the temporary directory here
+my $uploaddir = '/var/www/asdf.us/tmp/';
+#maximum filesize goes here
+my $maxFileSize = 2.2 * 1024 * 1024;
+
+#aws credentials here
+my $aws_access_key_id = "AKIAIR53VPBXKJMXZIBA";
+my $aws_secret_access_key = "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";
+
+#SQL CONNECTIONS
+my $sql_username = "asdfus";
+my $sql_dbname = "asdfus";
+my $sql_passwd = "gTYgT&M6q";
+my $db_tag = "shader";
+
+my $time_now = time();
+
+
+my $IN = new CGI;
+my $resp = {};
+
+sub get_postdata{
+ return $IN->param('POSTDATA');
+}
+
+#qq file is the default name for the file parameter when using qq upload. change if necessary
+sub get_filedata{
+ my $file = $IN->upload('qqfile');
+ if ($file){
+ return read_file( $file, binmode => ':raw' ) ;
+ }else{
+ return
+ }
+}
+
+
+sub get_filetype{
+ my $filedata = shift;
+ my $mm = new File::MMagic;
+ my $mtype = $mm->checktype_contents($filedata);
+ if ($mtype =~ m@^image/(gif|png|jpeg)@gi){
+ return $1;
+ }else{
+ return undef;
+ }
+}
+
+
+sub make_photoblaster_directory{
+ return substr(Digest::SHA1->sha1_hex($time_now), 0, 2);
+}
+sub make_photoblaster_filename{
+ var $filename = $IN->param("filename") || sprintf("%s_%s", "im", $time_now);
+ $filename =~ s/[^-a-zA-Z0-9]/-/g;
+ $filename =~ s/-+/-/g;
+ $filename =~ s/\....$//;
+ return $filename;
+}
+sub make_photoblaster_url{
+ my $photoblaster_directory = shift;
+ my $filename = shift;
+ return sprintf("http://i.asdf.us/im/%s/%s", $photoblaster_directory, $filename);
+}
+sub add_to_photoblaster_db{
+ my $pb_dir = shift;
+ my $filename = shift;
+ our $dbh = DBI->connect("DBI:mysql:$sql_dbname", $sql_username, $sql_passwd);
+ unless($dbh){ return undef && print STDERR "Could not connect to database: $DBI::errstr"};
+ my $execute = $dbh->do(
+ "INSERT INTO im_cmd ".
+ "(date, name, dir, newfile, tag)".
+ "VALUES(?,?,?,?,?);",
+ undef,
+ $time_now,
+ $IN->param("username") || "",
+ $pb_dir,
+ $filename,
+ $db_tag
+ );
+ return $execute;
+}
+
+sub write_to_file{
+ my $filepath = shift;
+ my $filedata = shift;
+ write_file( $filepath, {binmode => ':raw'}, $filedata ) or return undef;
+ return 1;
+}
+
+
+sub test_gif_size{
+ my $filepath = shift;
+ my $check_size = -s "$filepath";
+ print STDERR qq|Main filesize: $check_size Max Filesize: $maxFileSize nn|;
+ return $check_size;
+}
+
+sub optimize_gif{
+ my $filepath = shift;
+ my $tmpname = $filepath.".tmp";
+ #because system gives the unix exit code
+ not system("gifsicle -O2 --colors=256 $filepath > $tmpname") or return undef;
+ not system("mv -f $tmpname $filepath") or return undef;
+ return 1;
+}
+
+sub upload_to_AmazonS3{
+ my $keyname = shift;
+ my $value = shift;
+ my $s3 = Amazon::S3->new(
+ { aws_access_key_id => $aws_access_key_id,
+ aws_secret_access_key => $aws_secret_access_key
+ }
+ );
+ my $bucket = $s3->bucket("i.asdf.us");
+ $bucket->add_key(
+ $keyname, $value,
+ { content_type => 'text/plain',
+ 'x-amz-meta-colour' => 'orange',
+ }
+ );
+ return $bucket;
+}
+
+sub delete_file{
+ my $filepath = shift;
+ unlink($filepath);
+}
+sub error{
+ my $message = shift;
+ print qq|{"success":false, "error": $message }|;
+ exit 1;
+}
+
+
+sub main{
+ print $IN->header();
+
+ my $filedata = get_postdata() || get_filedata() || read_file("/tmp/tt.gif", binmode=>":raw");
+ unless($filedata){ error("NO DATA RECIEVED") };
+ my $filetype = get_filetype($filedata);
+ unless($filetype){ error("BAD FILE TYPE")};
+
+ my $photoblaster_directory = make_photoblaster_directory();
+ my $photoblaster_filename = sprintf("%s.%s", make_photoblaster_filename(), $filetype);
+
+ my $filepath = $uploaddir. $photoblaster_filename;
+
+ if ($filetype =~ /gif$/i){
+ unless(write_to_file($filepath, $filedata)){
+ error("UNABLE TO WRITE TO FILE");
+ }
+ unless (optimize_gif($filepath)){
+ error("UNABLE TO OPTIMIZE GIF");
+ }
+ my $filedata = read_file($filepath, binmode=>":raw");
+ }
+
+ my $filesize = length($filedata);
+ if ($filesize < 1) {
+ error( "EMPTY FILE");
+ } elsif ($filesize > $maxFileSize) {
+ error("FILE TOO LARGE");
+ }
+
+ unless(upload_to_AmazonS3(sprintf("im/%s/%s", $photoblaster_directory, $photoblaster_filename), $filedata)){
+ error("UNABLE TO UPLOAD TO AMAZONS3");
+ };
+ delete_file($filepath);
+ my $photoblaster_url = make_photoblaster_url($photoblaster_directory, $photoblaster_filename);
+ unless(add_to_photoblaster_db($photoblaster_directory, $photoblaster_filename)){
+ print STDERR "problem adding value to db";
+ }
+ print qq|{"success":true, "url": "$photoblaster_url", "filesize" : $filesize }|;
+}
+
+main();
+