adding support for file uploading to s3
This commit is contained in:
parent
95ec0de2da
commit
40a4ad9ea1
7 changed files with 85 additions and 12 deletions
2
Gemfile
2
Gemfile
|
@ -4,3 +4,5 @@ gem "rack"
|
|||
gem "sinatra"
|
||||
gem "sequel"
|
||||
gem "anybase"
|
||||
gem "aws-s3"
|
||||
|
||||
|
|
|
@ -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
57
main.rb
|
@ -10,7 +10,7 @@ configure do
|
|||
|
||||
require 'ostruct'
|
||||
Shorten = OpenStruct.new(
|
||||
:base_url => "http://➼.ws/",
|
||||
:base_url => ENV['url'],
|
||||
:service_name => "➼.ws",
|
||||
:button_text => "➼",
|
||||
: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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
1
views/image.erb
Normal file
|
@ -0,0 +1 @@
|
|||
<img src="<%= url %>" />
|
|
@ -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
6
views/upload.erb
Executable 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>
|
Loading…
Reference in a new issue