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 "sinatra"
|
||||||
gem "sequel"
|
gem "sequel"
|
||||||
gem "anybase"
|
gem "anybase"
|
||||||
|
gem "aws-s3"
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ class ShortenUrl < Sequel::Model
|
||||||
primary_key :id
|
primary_key :id
|
||||||
String :key
|
String :key
|
||||||
String :url
|
String :url
|
||||||
|
Boolean :image
|
||||||
Time :time
|
Time :time
|
||||||
end
|
end
|
||||||
create_table
|
create_table
|
||||||
|
@ -23,7 +24,7 @@ class ShortenUrl < Sequel::Model
|
||||||
"#{Shorten.base_url}#{self.key.to_s}"
|
"#{Shorten.base_url}#{self.key.to_s}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.create_url(link)
|
def self.create_url(link, image = false)
|
||||||
uri = URI::parse(link)
|
uri = URI::parse(link)
|
||||||
raise "Invalid URL" unless uri.kind_of? URI::HTTP or uri.kind_of? URI::HTTPS
|
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
|
key_check = self.filter(:url => key).first
|
||||||
end
|
end
|
||||||
|
|
||||||
url = self.new(:url => link, :key => key)
|
url = self.new(:url => link, :key => key, :image => image)
|
||||||
url.save
|
url.save
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
67
main.rb
67
main.rb
|
@ -10,7 +10,7 @@ configure do
|
||||||
|
|
||||||
require 'ostruct'
|
require 'ostruct'
|
||||||
Shorten = OpenStruct.new(
|
Shorten = OpenStruct.new(
|
||||||
:base_url => "http://➼.ws/",
|
:base_url => ENV['url'],
|
||||||
:service_name => "➼.ws",
|
:service_name => "➼.ws",
|
||||||
:button_text => "➼",
|
:button_text => "➼",
|
||||||
:path_size => 4
|
:path_size => 4
|
||||||
|
@ -91,14 +91,65 @@ end
|
||||||
post '/' do
|
post '/' do
|
||||||
validate_link params[:url]
|
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
|
end
|
||||||
|
|
||||||
get '/:short' do
|
get '/upload' do
|
||||||
url = ShortenUrl.find(:key => params[:short])
|
|
||||||
|
erb :upload
|
||||||
halt 404, "Page not found" unless url
|
|
||||||
redirect url.url
|
|
||||||
end
|
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>
|
<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 %>">
|
<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." %>
|
<% formtext = "Type URL. Press Enter." %>
|
||||||
|
|
||||||
<form method="POST" action="/">
|
<form method="POST" action="/">
|
||||||
<input type="text" name="url" id="url" size="30" value="<%= formtext %>"
|
<input type="text" name="url" id="url" size="30" value="<%= formtext %>"
|
||||||
onfocus="if ( this.value=='<%= formtext %>' ) { this.value = ''; }"
|
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" />
|
<input type="hidden" value="<%= Shorten.button_text %>" id="create_url" />
|
||||||
</form>
|
</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