From 927918561c15cccf9502c467a3934f1ca89f31a5 Mon Sep 17 00:00:00 2001
From: Espen Antonsen
Date: Tue, 13 Apr 2010 15:10:40 -0400
Subject: [PATCH] uploadify 2.1. carrierwave working. s3 support
---
.gems | 1 +
app/controllers/photos_controller.rb | 17 +-
.../flash_session_cookie_middleware.rb | 8 +-
app/models/photo.rb | 44 +-
app/uploaders/file_uploader.rb | 28 +-
app/views/albums/show.html.erb | 2 +-
app/views/collections/index.html.erb | 2 +-
app/views/photos/_photo.pdf.erb | 2 +-
app/views/photos/_thumb.html.erb | 2 +-
app/views/photos/edit.html.erb | 2 +-
app/views/photos/show.html.erb | 2 +-
app/views/photos/upload.html.erb | 12 +-
config/environment.rb | 3 +
config/initializers/s3.rb | 5 +
config/initializers/session_store.rb | 1 +
config/settings.example.yml | 19 +-
.../uploadify-2.1/Uploadify v2.1.0 Manual.pdf | Bin 0 -> 556466 bytes
public/javascripts/uploadify-2.1/cancel.png | Bin 0 -> 603 bytes
public/javascripts/uploadify-2.1/check.php | 35 +
.../com/adobe/air/logging/FileTarget.as | 98 +
.../uploadify-2.1/com/adobe/crypto/HMAC.as | 127 +
.../uploadify-2.1/com/adobe/crypto/MD5.as | 281 ++
.../com/adobe/crypto/MD5Stream.as | 402 +++
.../uploadify-2.1/com/adobe/crypto/SHA1.as | 271 ++
.../uploadify-2.1/com/adobe/crypto/SHA224.as | 257 ++
.../uploadify-2.1/com/adobe/crypto/SHA256.as | 261 ++
.../com/adobe/crypto/WSSEUsernameToken.as | 114 +
.../com/adobe/errors/IllegalStateError.as | 63 +
.../com/adobe/fileformats/vcard/Address.as | 47 +
.../com/adobe/fileformats/vcard/Email.as | 39 +
.../com/adobe/fileformats/vcard/Phone.as | 39 +
.../com/adobe/fileformats/vcard/VCard.as | 54 +
.../adobe/fileformats/vcard/VCardParser.as | 246 ++
.../com/adobe/images/BitString.as | 39 +
.../com/adobe/images/JPGEncoder.as | 648 +++++
.../com/adobe/images/PNGEncoder.as | 141 +
.../com/adobe/net/DynamicURLLoader.as | 55 +
.../com/adobe/net/IURIResolver.as | 76 +
.../com/adobe/net/MimeTypeMap.as | 196 ++
.../uploadify-2.1/com/adobe/net/URI.as | 2466 +++++++++++++++++
.../com/adobe/net/URIEncodingBitmap.as | 139 +
.../com/adobe/net/proxies/RFC2817Socket.as | 198 ++
.../com/adobe/protocols/dict/Database.as | 34 +
.../com/adobe/protocols/dict/Definition.as | 39 +
.../com/adobe/protocols/dict/Dict.as | 328 +++
.../adobe/protocols/dict/DictionaryServer.as | 28 +
.../com/adobe/protocols/dict/MatchStrategy.as | 34 +
.../com/adobe/protocols/dict/Response.as | 39 +
.../protocols/dict/events/ConnectedEvent.as | 14 +
.../protocols/dict/events/DatabaseEvent.as | 26 +
.../protocols/dict/events/DefinitionEvent.as | 27 +
.../dict/events/DefinitionHeaderEvent.as | 26 +
.../dict/events/DictionaryServerEvent.as | 26 +
.../dict/events/DisconnectedEvent.as | 14 +
.../adobe/protocols/dict/events/ErrorEvent.as | 37 +
.../adobe/protocols/dict/events/MatchEvent.as | 26 +
.../dict/events/MatchStrategiesEvent.as | 26 +
.../protocols/dict/events/NoMatchEvent.as | 14 +
.../dict/util/CompleteResponseEvent.as | 25 +
.../adobe/protocols/dict/util/SocketHelper.as | 49 +
.../com/adobe/serialization/json/JSON.as | 85 +
.../adobe/serialization/json/JSONDecoder.as | 221 ++
.../adobe/serialization/json/JSONEncoder.as | 299 ++
.../serialization/json/JSONParseError.as | 87 +
.../com/adobe/serialization/json/JSONToken.as | 104 +
.../adobe/serialization/json/JSONTokenType.as | 67 +
.../adobe/serialization/json/JSONTokenizer.as | 583 ++++
.../com/adobe/utils/ArrayUtil.as | 187 ++
.../uploadify-2.1/com/adobe/utils/DateUtil.as | 699 +++++
.../com/adobe/utils/DictionaryUtil.as | 87 +
.../uploadify-2.1/com/adobe/utils/IntUtil.as | 99 +
.../com/adobe/utils/NumberFormatter.as | 74 +
.../com/adobe/utils/StringUtil.as | 270 ++
.../uploadify-2.1/com/adobe/utils/XMLUtil.as | 168 ++
.../com/adobe/webapis/ServiceBase.as | 48 +
.../com/adobe/webapis/URLLoaderBase.as | 108 +
.../com/adobe/webapis/events/ServiceEvent.as | 75 +
.../uploadify-2.1/example/_notes/dwsync.xml | 5 +
.../uploadify-2.1/example/cancel.png | Bin 0 -> 603 bytes
.../example/css/_notes/dwsync.xml | 5 +
.../uploadify-2.1/example/css/default.css | 10 +
.../uploadify-2.1/example/css/uploadify.css | 53 +
.../uploadify-2.1/example/index.php | 31 +
.../example/scripts/_notes/dwsync.xml | 10 +
.../uploadify-2.1/example/scripts/check.php | 35 +
.../example/scripts/expressInstall.swf | Bin 0 -> 727 bytes
.../example/scripts/jquery-1.3.2.min.js | 19 +
.../scripts/jquery.uploadify.v2.1.0.min.js | 26 +
.../example/scripts/swfobject.js | 4 +
.../example/scripts/uploadify.php | 46 +
.../example/scripts/uploadify.swf | Bin 0 -> 23119 bytes
.../uploadify-2.1/expressInstall.swf | Bin 0 -> 727 bytes
.../uploadify-2.1/jquery-1.3.2.min.js | 19 +
.../uploadify-2.1/jquery.uploadify.v2.1.0.js | 258 ++
.../jquery.uploadify.v2.1.0.min.js | 26 +
public/javascripts/uploadify-2.1/swfobject.js | 4 +
.../uploadify-2.1/uploadify.allglyphs.swf | Bin 0 -> 239838 bytes
.../javascripts/uploadify-2.1/uploadify.css | 53 +
.../javascripts/uploadify-2.1/uploadify.fla | Bin 0 -> 125952 bytes
.../javascripts/uploadify-2.1/uploadify.php | 46 +
.../javascripts/uploadify-2.1/uploadify.swf | Bin 0 -> 23118 bytes
101 files changed, 11079 insertions(+), 86 deletions(-)
create mode 100644 config/initializers/s3.rb
create mode 100755 public/javascripts/uploadify-2.1/Uploadify v2.1.0 Manual.pdf
create mode 100755 public/javascripts/uploadify-2.1/cancel.png
create mode 100755 public/javascripts/uploadify-2.1/check.php
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/air/logging/FileTarget.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/crypto/HMAC.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/crypto/MD5.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/crypto/MD5Stream.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/crypto/SHA1.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/crypto/SHA224.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/crypto/SHA256.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/crypto/WSSEUsernameToken.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/errors/IllegalStateError.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/fileformats/vcard/Address.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/fileformats/vcard/Email.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/fileformats/vcard/Phone.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/fileformats/vcard/VCard.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/fileformats/vcard/VCardParser.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/images/BitString.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/images/JPGEncoder.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/images/PNGEncoder.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/net/DynamicURLLoader.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/net/IURIResolver.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/net/MimeTypeMap.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/net/URI.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/net/URIEncodingBitmap.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/net/proxies/RFC2817Socket.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/Database.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/Definition.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/Dict.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/DictionaryServer.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/MatchStrategy.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/Response.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/events/ConnectedEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/events/DatabaseEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/events/DefinitionEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/events/DefinitionHeaderEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/events/DictionaryServerEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/events/DisconnectedEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/events/ErrorEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/events/MatchEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/events/MatchStrategiesEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/events/NoMatchEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/util/CompleteResponseEvent.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/protocols/dict/util/SocketHelper.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/serialization/json/JSON.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/serialization/json/JSONDecoder.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/serialization/json/JSONEncoder.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/serialization/json/JSONParseError.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/serialization/json/JSONToken.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/serialization/json/JSONTokenType.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/serialization/json/JSONTokenizer.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/utils/ArrayUtil.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/utils/DateUtil.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/utils/DictionaryUtil.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/utils/IntUtil.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/utils/NumberFormatter.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/utils/StringUtil.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/utils/XMLUtil.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/webapis/ServiceBase.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/webapis/URLLoaderBase.as
create mode 100755 public/javascripts/uploadify-2.1/com/adobe/webapis/events/ServiceEvent.as
create mode 100755 public/javascripts/uploadify-2.1/example/_notes/dwsync.xml
create mode 100755 public/javascripts/uploadify-2.1/example/cancel.png
create mode 100755 public/javascripts/uploadify-2.1/example/css/_notes/dwsync.xml
create mode 100755 public/javascripts/uploadify-2.1/example/css/default.css
create mode 100755 public/javascripts/uploadify-2.1/example/css/uploadify.css
create mode 100755 public/javascripts/uploadify-2.1/example/index.php
create mode 100755 public/javascripts/uploadify-2.1/example/scripts/_notes/dwsync.xml
create mode 100755 public/javascripts/uploadify-2.1/example/scripts/check.php
create mode 100755 public/javascripts/uploadify-2.1/example/scripts/expressInstall.swf
create mode 100755 public/javascripts/uploadify-2.1/example/scripts/jquery-1.3.2.min.js
create mode 100755 public/javascripts/uploadify-2.1/example/scripts/jquery.uploadify.v2.1.0.min.js
create mode 100755 public/javascripts/uploadify-2.1/example/scripts/swfobject.js
create mode 100755 public/javascripts/uploadify-2.1/example/scripts/uploadify.php
create mode 100755 public/javascripts/uploadify-2.1/example/scripts/uploadify.swf
create mode 100755 public/javascripts/uploadify-2.1/expressInstall.swf
create mode 100755 public/javascripts/uploadify-2.1/jquery-1.3.2.min.js
create mode 100755 public/javascripts/uploadify-2.1/jquery.uploadify.v2.1.0.js
create mode 100755 public/javascripts/uploadify-2.1/jquery.uploadify.v2.1.0.min.js
create mode 100755 public/javascripts/uploadify-2.1/swfobject.js
create mode 100755 public/javascripts/uploadify-2.1/uploadify.allglyphs.swf
create mode 100755 public/javascripts/uploadify-2.1/uploadify.css
create mode 100755 public/javascripts/uploadify-2.1/uploadify.fla
create mode 100755 public/javascripts/uploadify-2.1/uploadify.php
create mode 100755 public/javascripts/uploadify-2.1/uploadify.swf
diff --git a/.gems b/.gems
index 99acd23..c9e07b3 100644
--- a/.gems
+++ b/.gems
@@ -1,2 +1,3 @@
authlogic
carrierwave
+aws-s3
diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb
index 36cd50b..60ace09 100644
--- a/app/controllers/photos_controller.rb
+++ b/app/controllers/photos_controller.rb
@@ -1,4 +1,5 @@
class PhotosController < ApplicationController
+#skip_before_filter :verify_authenticity_token
before_filter :check_public_access
before_filter :require_role_admin, :only => [:untouched, :upload, :new, :create, :edit, :update, :destroy]
@@ -73,27 +74,15 @@ class PhotosController < ApplicationController
end
def create
+ @photo = Photo.new(params[:photo])
respond_to do |format|
- @photo = Photo.new(params[:photo])
- if params[:Filedata]
- #@photo.swf_uploaded_data = params[:Filedata]
if @photo.save
- format.html { render :text => "FILEID:" + @photo.path_modified_public("album") }
+ format.html { render :text => "FILEID:" + @photo.file.album.url }
format.xml { render :nothing => true }
else
format.html { render :text => "ERRORS:" + @photo.errors.full_messages.join(" "), :status => 500 }
format.xml { render :xml => @photo.errors, :status => 500 }
end
- else
- if @photo.save
- flash[:notice] = 'Created'
- format.html { redirect_to(@photo) }
- format.xml { render :xml => @photo }
- else
- format.html { render :action => "new" }
- format.xml { render :xml => @photo.errors }
- end
- end
end
end
diff --git a/app/middleware/flash_session_cookie_middleware.rb b/app/middleware/flash_session_cookie_middleware.rb
index dd86e09..adc6091 100644
--- a/app/middleware/flash_session_cookie_middleware.rb
+++ b/app/middleware/flash_session_cookie_middleware.rb
@@ -8,9 +8,13 @@ class FlashSessionCookieMiddleware
def call(env)
if env['HTTP_USER_AGENT'] =~ /^(Adobe|Shockwave) Flash/
- params = ::Rack::Utils.parse_query(env['QUERY_STRING'])
- env['HTTP_COOKIE'] = [ @session_key, params[@session_key] ].join('=').freeze unless params[@session_key].nil?
+ params = ::Rack::Request.new(env).params
+
+ unless params[@session_key].nil?
+ env['HTTP_COOKIE'] = "#{@session_key}=#{params[@session_key]}".freeze
+ end
end
+
@app.call(env)
end
end
\ No newline at end of file
diff --git a/app/models/photo.rb b/app/models/photo.rb
index 7ebfb3f..f128013 100644
--- a/app/models/photo.rb
+++ b/app/models/photo.rb
@@ -1,4 +1,4 @@
-require "image_science"
+#require "image_science"
require 'mini_exiftool'
class Photo < ActiveRecord::Base
@@ -9,14 +9,11 @@ class Photo < ActiveRecord::Base
mount_uploader :file, FileUploader
#validates_uniqueness_of :path, :message => "Photo already exsists on disc"
- #validates_presence_of :title
+ validates_presence_of :title
before_validation :set_title
- #before_save :ensure_file
- #before_create :exif_read
- #after_create :create_thumbnails
- #before_update :exif_write # should only write if tags are changed as images can be large and thus ExifTool will take a while to write to the file
- before_destroy :destroy_file
+ before_create :exif_read
+ before_update :exif_write # should only write if tags are changed as images can be large and thus ExifTool will take a while to write to the file
attr_accessor :tag_list
#attr_protected :path
@@ -29,14 +26,6 @@ class Photo < ActiveRecord::Base
"#{id}-#{title.parameterize}"
end
- def path_original_public
- return APP_CONFIG[:photos_path_public] + self.path
- end
-
- def path_modified_public(size)
- return APP_CONFIG[:thumbs_path_public] + self.album.path + "/" + self.id.to_s + "_" + size + self.extension
- end
-
def tag(title)
return if self.tags.collect{|tag|tag.title}.include?( title )
self.photo_tags.create(:tag => Tag.find_or_create_by_title( :title => title) )
@@ -74,23 +63,12 @@ class Photo < ActiveRecord::Base
protected
- def extension
- return File.extname(self.path_original)
- end
- def path_original
- return APP_CONFIG[:photos_path] + self.path
- end
-
- def path_modified(size)
- return APP_CONFIG[:thumbs_path] + self.album.path + "/" + self.id.to_s + "_" + size + self.extension
- end
private
def set_title
- self.title = "tesitn"
- #self.title = self.file.filename.titleize unless self.title
+ self.title = self.file.filename.titleize unless self.title
end
def ensure_file
@@ -98,7 +76,7 @@ class Photo < ActiveRecord::Base
end
def exif_read
- photo = MiniExiftool.new(self.path_original)
+ photo = MiniExiftool.new(self.file.path)
self.longitude = photo.GPSLongitude if self.longitude.nil?
self.latitude = photo.GPSLatitude if self.latitude.nil?
self.title = photo.DocumentName if self.title.nil?
@@ -107,7 +85,7 @@ class Photo < ActiveRecord::Base
end
def exif_write
- photo = MiniExiftool.new(self.path_original)
+ photo = MiniExiftool.new(self.path.file)
photo.GPSLongitude = self.longitude
photo.GPSLatitude = self.latitude
photo.DocumentName = self.title
@@ -116,11 +94,5 @@ class Photo < ActiveRecord::Base
photo.save
end
- def destroy_file
- File.delete( self.path_original ) if File.exists?( self.path_original )
- File.delete( self.path_modified("_collection") ) if File.exists?( self.path_modified("_collection") )
- File.delete( self.path_modified("_album") ) if File.exists?( self.path_modified("_album") )
- File.delete( self.path_modified("_single") ) if File.exists?( self.path_modified("_single") )
- File.delete( self.path_modified("_preview") ) if File.exists?( self.path_modified("_preview") )
- end
+
end
diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb
index 1e1e6c4..2390eed 100644
--- a/app/uploaders/file_uploader.rb
+++ b/app/uploaders/file_uploader.rb
@@ -7,13 +7,14 @@ class FileUploader < CarrierWave::Uploader::Base
# include CarrierWave::ImageScience
# Choose what kind of storage to use for this uploader
- storage :file
- # storage :s3
+ #storage :file
+ storage :s3
+
# Override the directory where uploaded files will be stored
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
- # "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
+ #{}"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
"uploads/files/#{model.album.path}"
end
@@ -30,18 +31,29 @@ class FileUploader < CarrierWave::Uploader::Base
# end
# Create different versions of your uploaded files
- # two firsts should be cropped
version :collection do
- process :scale => [200, 200]
+ process :resize_to_fill => [200, 200]
+ def store_dir
+ "uploads/thumbs/#{model.album.path}"
+ end
end
version :album do
- process :scale => [100, 100]
+ process :resize_to_fill => [100, 100]
+ def store_dir
+ "uploads/thumbs/#{model.album.path}"
+ end
end
version :preview do
- process :scale => [210, 210]
+ process :resize_to_fit => [210, 210]
+ def store_dir
+ "uploads/thumbs/#{model.album.path}"
+ end
end
version :single do
- process :scale => [950, 950]
+ process :resize_to_fit => [950, 950]
+ def store_dir
+ "uploads/thumbs/#{model.album.path}"
+ end
end
# Add a white list of extensions which are allowed to be uploaded,
diff --git a/app/views/albums/show.html.erb b/app/views/albums/show.html.erb
index 592e165..20f9e35 100644
--- a/app/views/albums/show.html.erb
+++ b/app/views/albums/show.html.erb
@@ -6,7 +6,7 @@
<% for photo in @album.photos.find(:all, :order => "Id ASC") %>
<% count += 1%>
<% if count == 1 || ( (count-1) / 4.0 == ( (count-1) / 4.0).to_i ) %><% end %>
- <%= link_to image_tag( photo.path_modified_public("preview") ), [@album.collections.first, @album, photo] %> |
+ <%= link_to image_tag( photo.file.preview.url ), [@album.collections.first, @album, photo] %> |
<% if count / 4.0 == (count / 4.0).to_i %>
<% end %>
<% end %>
diff --git a/app/views/collections/index.html.erb b/app/views/collections/index.html.erb
index 84ec61a..b07fafd 100644
--- a/app/views/collections/index.html.erb
+++ b/app/views/collections/index.html.erb
@@ -2,7 +2,7 @@
<% for collection in @collections %>
<%= link_to collection.title, collection %>
- <%= link_to (image_tag collection.albums.find(:first).photos.first.path_modified_public('collection') ), collection_path(collection) unless collection.albums.empty? || collection.albums.find(:first).photos.empty? %>
+ <%= link_to (image_tag collection.albums.find(:first).photos.first.file.collection.url ), collection_path(collection) unless collection.albums.empty? || collection.albums.find(:first).photos.empty? %>
<% end %>
diff --git a/app/views/photos/_photo.pdf.erb b/app/views/photos/_photo.pdf.erb
index 1803291..00259fe 100644
--- a/app/views/photos/_photo.pdf.erb
+++ b/app/views/photos/_photo.pdf.erb
@@ -1 +1 @@
-<%= image_tag photo.path_modified_public("single") %>
\ No newline at end of file
+<%= image_tag photo.file.single.url %>
\ No newline at end of file
diff --git a/app/views/photos/_thumb.html.erb b/app/views/photos/_thumb.html.erb
index 416997a..fc8870b 100644
--- a/app/views/photos/_thumb.html.erb
+++ b/app/views/photos/_thumb.html.erb
@@ -1 +1 @@
-<%= link_to (image_tag photo.path_modified_public(defined?(photosize) ? photosize : "album") ), [photo.album.collections.first, photo.album, photo] %>
\ No newline at end of file
+<%= link_to (image_tag eval('photo.file.' + (defined?(photosize) ? photosize : "album") + '.url') ), [photo.album.collections.first, photo.album, photo] %>
\ No newline at end of file
diff --git a/app/views/photos/edit.html.erb b/app/views/photos/edit.html.erb
index 459d676..bc6639a 100644
--- a/app/views/photos/edit.html.erb
+++ b/app/views/photos/edit.html.erb
@@ -1,6 +1,6 @@
Edit Photo
-<%= image_tag @photo.path_modified_public("preview") %>
+<%= image_tag @photo.file.preview.url %>
<% form_for @photo do |f| %>
<%= f.error_messages %>
diff --git a/app/views/photos/show.html.erb b/app/views/photos/show.html.erb
index d6d0ff9..e3c6a9e 100644
--- a/app/views/photos/show.html.erb
+++ b/app/views/photos/show.html.erb
@@ -14,7 +14,7 @@
<% end %>
- <%= link_to_if @next, image_tag(@photo.path_modified_public("single")), [ @photo.album.collections.first, @photo.album, @next] %>
+ <%= link_to_if @next, image_tag(@photo.file.single.url ), [ @photo.album.collections.first, @photo.album, @next] %>
<%= @photo.description %>
diff --git a/app/views/photos/upload.html.erb b/app/views/photos/upload.html.erb
index e8ab10a..8916f1c 100644
--- a/app/views/photos/upload.html.erb
+++ b/app/views/photos/upload.html.erb
@@ -1,14 +1,16 @@
<% content_for :javascript do %>
-
+
+
<% end %>
diff --git a/config/environment.rb b/config/environment.rb
index 575c2cd..c1adefc 100644
--- a/config/environment.rb
+++ b/config/environment.rb
@@ -15,11 +15,14 @@ Rails::Initializer.run do |config|
#config.gem "mini_exiftool"
#
config.gem "carrierwave"
+ #config.gem "aws-s3", :lib => "aws/s3"
config.load_paths += %W( #{RAILS_ROOT}/app/middleware )
config.time_zone = 'Copenhagen'
config.i18n.default_locale = 'no-NB'
+
+
end
\ No newline at end of file
diff --git a/config/initializers/s3.rb b/config/initializers/s3.rb
new file mode 100644
index 0000000..600c0e2
--- /dev/null
+++ b/config/initializers/s3.rb
@@ -0,0 +1,5 @@
+CarrierWave.configure do |config|
+ config.s3_access_key_id = APP_CONFIG[:s3_access_key_id]
+ config.s3_secret_access_key = APP_CONFIG[:s3_secret_access_key]
+ config.s3_bucket = APP_CONFIG[:s3_bucket]
+ end
\ No newline at end of file
diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb
index 0b224e3..79242cc 100644
--- a/config/initializers/session_store.rb
+++ b/config/initializers/session_store.rb
@@ -14,5 +14,6 @@ ActionController::Base.session = {
# (create the session table with "rake db:sessions:create")
# ActionController::Base.session_store = :active_record_store
+
ActionController::Dispatcher.middleware.insert_before(ActionController::Session::CookieStore, FlashSessionCookieMiddleware, ActionController::Base.session_options[:key])
#ActionController::Dispatcher.middleware.use FlashSessionCookieMiddleware, ActionController::Base.session_options[:key]
\ No newline at end of file
diff --git a/config/settings.example.yml b/config/settings.example.yml
index a895f54..aa87707 100644
--- a/config/settings.example.yml
+++ b/config/settings.example.yml
@@ -2,23 +2,12 @@ development:
public: true
site_name: 'Photos'
#site_logo: 'logo.png'
- photos_path: <%= RAILS_ROOT + '/photos/' %>
- thumbs_path: <%= RAILS_ROOT + '/public/thumbs/' %>
- photos_path_public: '/files/'
- thumbs_path_public: '/thumbs/'
+ #s3_access_key_id: ''
+ #s3_secret_access_key: ''
+ #s3_bucket: ''
production:
public: true
site_name: 'Photos'
- #site_logo: 'logo.png'
- photos_path: <%= RAILS_ROOT + '/photos/' %>
- thumbs_path: <%= RAILS_ROOT + '/public/thumbs/' %>
- photos_path_public: '/files/'
- thumbs_path_public: '/thumbs/'
test:
public: true
- site_name: 'Photos'
- #site_logo: 'logo.png'
- photos_path: <%= RAILS_ROOT + '/photos/' %>
- thumbs_path: <%= RAILS_ROOT + '/public/thumbs/' %>
- photos_path_public: '/files/'
- thumbs_path_public: '/thumbs/'
\ No newline at end of file
+ site_name: 'Photos'
\ No newline at end of file
diff --git a/public/javascripts/uploadify-2.1/Uploadify v2.1.0 Manual.pdf b/public/javascripts/uploadify-2.1/Uploadify v2.1.0 Manual.pdf
new file mode 100755
index 0000000000000000000000000000000000000000..c8b2565b50f97fd8f085500f0e0ed0f42f0f6b75
GIT binary patch
literal 556466
zcmce;Wmr{RyZ23ZsdOWaAh4)KcXxMpHwX%Xq=X=ibP7mGmvjk8cZhU1NW-(d?(5$7
zn(uS%XYWt1$ANQ=d5-waG0!pnbIdqtRV1WX*k5vC(yp$JOkkpMak5jgQ97I1VG0Pa
zD%d(%n!4HgT3S%Dvno(>adC5UbF(T_a&dC7N>Z}(aPac5DpB&VYWy*=v2(M^Q0h~1
z@^VvhaDfelgfK0gEdJC)3HS$TgNye+ZAe&}J6l+)n7TQ-Ls}GfcJOp`a;M~ERdKVl
zur>E^cB5nm2??=E**bVwy0J<*n0i?Ls|c&CguVcXi(N{BN0f(yheM2$jguS93+9#N
zkQ9^T;*sPPlav$^;O1f%5L%P7-!_Csv5fjbkrSc$Qd`4TP^u
zB2T?Vg5hFKJYc^DbYd{~QqEc7c%y|Qs&!7HspVqOG~@*Y$HKq9kOf)u3G+J6oWhqRwzs>=q?|J?l
z*x%<@9CE;H|Jb#Z93arY4<5wL0XgR&Fej@zC5R0SI4Bbn6S!P0Bzz%3Fx38)2d5;0fU+It*K0$_p!vVfz`uOs?_O3kb+iBD
zR1o+6^Aj?dJls4jAwI2W>0xSN>S0RB!SR$I`?>#0tC(6_Dwz5>dwQ@c
zJ6Zl~Xt4g-=}yVT@n;CBv8qF=GWXDMv$Xt|PxAb=_b*Qrht%xgZ2g~M2pP2y>%ULE
zvy+FVlZQLR?f+^F;?94Sg>3(-8RF`HjR45@&xD``+5YA3knLZvkS*t*{f4aKZq6=Z
z&ad>@UP1~${m_6`DMALZ>3?g5jCuⅇtgPrMt7Io4MuR6M?gvx{Il~
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%0D+9e(sNt
zz38pSowNAcT`wD7KHvN1zkb)X54i3RPTla0J+9v2E%|S6oL_SN)}ycN^3}gT_M)fX
zbn?soWS@5)_MnZYUi;hscKk(8Uw8F=9(TaQ)@^+7KJR?Mp6~t6y$`<2cDvsA*Y8^Y
z#fKkv(PitddF$g2IQXQE54_jA)}QmSWAh)b`rxJwqYJ0++V!&6e`@~$d+DhM{NRYk
z?04H%pZdxVw?1p#;iD5SdgQvR9=U15?_N0Fb)R?M`GxN}YuC%R+VIsc-2345+aGz_
zPWL-_{dR}k^w)p3?&5zqK9N`7>v0GC;YsJcY1gOUdAs}H{MR2_clCoeZMg5A`~B_k
zAKr2O*3Vgg@rRDR=ug&d{O|j`^KKg+eQo~37e93TMSpVAjsN42dpvmi3txW9rVZP?
z@Ud^+_33x|&NHvy`Wx%cdCRdEjZeDat$Q5szzbjgPfPG^e|Ot|KIkJ`@A=rn{@@ko
zZ9Dtq`a^fU>J^6_cHZ~z{>0C`;y-?R$WJ#s`_9{4zVVkIx^cVzeYc%AUA6a-XFTic
z^Lw3i?6seL>BhT0G1$GHeffFYp1Xhk*9{*(_mJ~X-DUmB*X{7ZL-x4G8-F%j@Z2LW
zKkwAhwi`AbbN>%tI=^P!HCJx+%e{WI@gXPOxZnRe;DK-Wrw`x!-J9P0w7Y-vGY9Ul
z^$X8G`;33N`Os5N`}8$;-SFr0i#Of4_L%q2w|f2kxBmM>zW3w@TzA(E|MK8p-0cfr
zpYOBonuqRx%o`rO{`K!T|8?Iu_UK!V`fuCs_R#0;wCRg)UiZb<{q*Yb1K)SS4(q@8
zy2aH8{?Ybld}e;kv5((<{pq%
z7oPXfecpTb4M$vg?_KZo`h9P__|kRPe0bCR0WUoNNk?7$@O9T5ylH;t1I|DG>ie8@
z;{zYJ@opC$`=J*;>YBYi|LJ?5bmKn-dg1w}?E1|0+n;giJwLMU