grifizoid 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +6 -12
- data/lib/grifizoid.rb +5 -24
- metadata +1 -1
data/README.md
CHANGED
@@ -14,22 +14,16 @@ It's sending a file handler not the raw data, so this should be low-memory use e
|
|
14
14
|
and `bundle install`
|
15
15
|
|
16
16
|
## Use with Rails 3
|
17
|
-
|
17
|
+
|
18
18
|
# application.rb
|
19
|
-
|
20
|
-
# /images/file.jpg => images/file.jpg
|
21
|
-
config.middleware.use Grifizoid
|
22
|
-
|
23
|
-
# /file.jpg => #{site.to_param}/images/file.jpg
|
24
|
-
config.middleware.use Grifizoid do |req|
|
19
|
+
config.middleware.use Rack::GridFS do |req|
|
25
20
|
site = Site.where(:host => req.host).first
|
26
21
|
|
27
22
|
File.join(site.to_param, req.path_info)
|
28
23
|
end
|
29
|
-
|
30
24
|
|
31
|
-
Now someone going to
|
25
|
+
Now someone going to http://mydomain.com/file.jpg will result in the middleware doing a query to find the site 'mydomain.com' (with an ID like `4d80c69f4cfad13cd100000c`) and then looks for a GridFS file named `4d80c69f4cfad13cd100000c/file.jpg`, sending it through to the client if found or else passing the request through to your app
|
32
26
|
|
33
|
-
Some ideas/code taken from:
|
34
|
-
|
35
|
-
|
27
|
+
Some ideas/code taken from:
|
28
|
+
https://github.com/dusty/rack_grid
|
29
|
+
https://github.com/skinandbones/rack-gridfs
|
data/lib/grifizoid.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
|
3
1
|
class Grifizoid
|
4
2
|
def initialize(app, &path_blk)
|
5
3
|
@app = app
|
@@ -9,8 +7,9 @@ class Grifizoid
|
|
9
7
|
# Get file from GridFileSystem or pass-thru
|
10
8
|
def call(env)
|
11
9
|
begin
|
12
|
-
|
13
|
-
|
10
|
+
gfs_path = extract_gfs_path(env)
|
11
|
+
file = Mongo::GridFileSystem.new(Mongoid.database).open(gfs_path, 'r')
|
12
|
+
etag, last_modified = file.instance_variable_get(:@md5), Time.at( file.upload_date.to_i )
|
14
13
|
|
15
14
|
headers = {
|
16
15
|
'ETag' => "\"#{etag}\"",
|
@@ -19,32 +18,14 @@ class Grifizoid
|
|
19
18
|
if not_modified?(env, etag, last_modified )
|
20
19
|
[304, headers, 'Not Modified']
|
21
20
|
else
|
22
|
-
[200, headers.merge('Content-Type' =>
|
21
|
+
[200, headers.merge('Content-Type' => file.content_type, 'Content-Length' => file.file_length.to_s), file]
|
23
22
|
end
|
24
23
|
rescue Mongo::GridError, Mongo::GridFileNotFound
|
25
24
|
@app.call(env)
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
29
|
-
|
30
|
-
gfs_path = extract_gfs_path(env)
|
31
|
-
fs_path = File.join(Rails.root, "tmp/grifizoid/#{gfs_path}")
|
32
|
-
|
33
|
-
mongo_file = Mongo::GridFileSystem.new(Mongoid.database).open(gfs_path, 'r')
|
34
|
-
#updated_at = Time.at(mongo_file.upload_date.to_i)
|
35
|
-
|
36
|
-
fs_file = File.open(fs_path, 'r') if File.exists?(fs_path)
|
37
|
-
fs_file ||= begin
|
38
|
-
FileUtils.mkdir_p File.dirname(fs_path)
|
39
|
-
File.open(fs_path, 'wb'){ |f| f << mongo_file.read }
|
40
|
-
File.open(fs_path, 'r')
|
41
|
-
#File.utime(updated_at, updated_at, fs_path)
|
42
|
-
end
|
43
|
-
|
44
|
-
[mongo_file, fs_file]
|
45
|
-
end
|
46
|
-
|
47
|
-
# use raw path or pass request to block to let user set a custom path
|
28
|
+
# use raw path or path request to block to let user set a custom path
|
48
29
|
def extract_gfs_path(env)
|
49
30
|
request = Rack::Request.new(env)
|
50
31
|
|