adding support for file uploading to s3

This commit is contained in:
Andrew Davidson 2010-10-27 20:05:12 -07:00
parent 95ec0de2da
commit 40a4ad9ea1
7 changed files with 85 additions and 12 deletions

View file

@ -4,3 +4,5 @@ gem "rack"
gem "sinatra"
gem "sequel"
gem "anybase"
gem "aws-s3"

View file

@ -7,6 +7,7 @@ class ShortenUrl < Sequel::Model
primary_key :id
String :key
String :url
Boolean :image
Time :time
end
create_table
@ -23,7 +24,7 @@ class ShortenUrl < Sequel::Model
"#{Shorten.base_url}#{self.key.to_s}"
end
def self.create_url(link)
def self.create_url(link, image = false)
uri = URI::parse(link)
raise "Invalid URL" unless uri.kind_of? URI::HTTP or uri.kind_of? URI::HTTPS
@ -38,7 +39,7 @@ class ShortenUrl < Sequel::Model
key_check = self.filter(:url => key).first
end
url = self.new(:url => link, :key => key)
url = self.new(:url => link, :key => key, :image => image)
url.save
end

57
main.rb
View file

@ -10,7 +10,7 @@ configure do
require 'ostruct'
Shorten = OpenStruct.new(
:base_url => "http://➼.ws/",
:base_url => ENV['url'],
:service_name => "&#x27bc;.ws",
:button_text => "&#x27bc;",
:path_size => 4
@ -91,14 +91,65 @@ end
post '/' do
validate_link params[:url]
url = ShortenUrl.create_url(params[:url])
url = ShortenUrl.create_url(params[:url], params[:image])
erb :finished, :locals => { :url => url, :type => "finished" }
erb :finished, :locals => { :url => url, :type => "finished", :image => params[:image] }
end
get '/upload' do
erb :upload
end
post '/upload' do
require 'aws/s3'
# establish connection
AWS::S3::Base.establish_connection!(
:access_key_id => ENV['s3_key'],
:secret_access_key => ENV['s3_secret']
)
# generate key and check uniqueness
key = Anybase::Base62.random(Shorten.path_size)
key_check = ShortenUrl.filter(:url => key).first
while key_check
key = Anybase::Base62.random(Shorten.path_size)
key_check = ShortenUrl.filter(:url => key).first
end
# merge key and extension
ext = File.extname(params[:file][:filename])
filename = key + ext
#filename = params[:file][:filename]
# upload to S3
AWS::S3::S3Object.store(filename, open(params[:file][:tempfile]), 'shorten', :access => :public_read)
object_url = AWS::S3::S3Object.url_for(filename, 'shorten', :authenticated => false)
# generate shorturl
url = ShortenUrl.new(:url => object_url, :key => key, :image => params[:image])
url.save
#url = ShortenUrl.create_url(object_url, params[:image])
erb :finished, :locals => { :url => url, :type => "finished", :image => params[:image] }
end
get '/:short' do
url = ShortenUrl.find(:key => params[:short])
halt 404, "Page not found" unless url
if url.image == true
erb :image, :locals => {:url => url.url}
else
redirect url.url
end
end

View file

@ -1,3 +1,13 @@
<h1><a href="<%= url.short_url %>"><%= url.short_url %></a></h1>
<p>Redirects to <a href="<%= url.url %>"><%= url.url %></a></p>
<p><a href="mailto:?subject=Shortened%20URL&body=<%= url.short_url %>">
Email</a> -- <a href="http://twitter.com/home?status=<%= url.short_url %>">Tweet</a></p>
Email Link</a> -- <a href="http://twitter.com/home?status=<%= url.short_url %>">Tweet Link</a></p>
<% if image then %>
<p>Check image embedding below:</p>
<p><img src="<%= url.url %>" /></p>
<% end %>

1
views/image.erb Normal file
View file

@ -0,0 +1 @@
<img src="<%= url %>" />

View file

@ -1,9 +1,11 @@
<p style="margin-top:100px;">Shorten URL -- <a href="/upload">Upload File</a></p>
<% formtext = "Type URL. Press Enter." %>
<form method="POST" action="/">
<input type="text" name="url" id="url" size="30" value="<%= formtext %>"
onfocus="if ( this.value=='<%= formtext %>' ) { this.value = ''; }"
onblur="if ( this.value=='' ) { this.value = '<%= formtext %>'; }"/>
onblur="if ( this.value=='' ) { this.value = '<%= formtext %>'; }"/><br/>
Embed as image? <input type="checkbox" name="image" />
<input type="hidden" value="<%= Shorten.button_text %>" id="create_url" />
</form>

6
views/upload.erb Executable file
View file

@ -0,0 +1,6 @@
<p style="margin-top:100px;"><a href="/">Shorten URL</a> -- Upload File</p>
<form method="POST" action="/upload" enctype="multipart/form-data">
<input type="file" name="file" /><br/>
Embed as image? <input type="checkbox" name="image" /><br/>
<input type="submit" value="Upload" id="upload" />
</form>