mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-01-31 03:59:51 +08:00
Activestorage fix for disk storage
[SCI-3947]
This commit is contained in:
parent
4b626ab2dd
commit
e2a779ccfe
6 changed files with 84 additions and 7 deletions
64
app/controllers/active_storage/disk_controller.rb
Normal file
64
app/controllers/active_storage/disk_controller.rb
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module ActiveStorage
|
||||||
|
class DiskController < ActiveStorage::BaseController
|
||||||
|
skip_forgery_protection
|
||||||
|
skip_before_action :authenticate_user!, :authenticate_user_from_token!, only: :show # Skip authentication
|
||||||
|
|
||||||
|
def show
|
||||||
|
if (key = decode_verified_key)
|
||||||
|
serve_file disk_service.path_for(key[:key]), content_type: key[:content_type], disposition: key[:disposition]
|
||||||
|
else
|
||||||
|
head :not_found
|
||||||
|
end
|
||||||
|
rescue Errno::ENOENT
|
||||||
|
head :not_found
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if (token = decode_verified_token)
|
||||||
|
if acceptable_content?(token)
|
||||||
|
disk_service.upload token[:key], request.body, checksum: token[:checksum]
|
||||||
|
else
|
||||||
|
head :unprocessable_entity
|
||||||
|
end
|
||||||
|
else
|
||||||
|
head :not_found
|
||||||
|
end
|
||||||
|
rescue ActiveStorage::IntegrityError
|
||||||
|
head :unprocessable_entity
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def disk_service
|
||||||
|
ActiveStorage::Blob.service
|
||||||
|
end
|
||||||
|
|
||||||
|
def decode_verified_key
|
||||||
|
ActiveStorage.verifier.verified(params[:encoded_key], purpose: :blob_key)
|
||||||
|
end
|
||||||
|
|
||||||
|
def serve_file(path, content_type:, disposition:)
|
||||||
|
Rack::File.new(nil).serving(request, path).tap do |(status, headers, body)|
|
||||||
|
self.status = status
|
||||||
|
self.response_body = body
|
||||||
|
|
||||||
|
headers.each do |name, value|
|
||||||
|
response.headers[name] = value
|
||||||
|
end
|
||||||
|
|
||||||
|
response.headers['Content-Type'] = content_type || DEFAULT_SEND_FILE_TYPE
|
||||||
|
response.headers['Content-Disposition'] = disposition || DEFAULT_SEND_FILE_DISPOSITION
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def decode_verified_token
|
||||||
|
ActiveStorage.verifier.verified(params[:encoded_token], purpose: :blob_token)
|
||||||
|
end
|
||||||
|
|
||||||
|
def acceptable_content?(token)
|
||||||
|
token[:content_type] == request.content_mime_type && token[:content_length] == request.content_length
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -243,6 +243,12 @@ class Asset < ApplicationRecord
|
||||||
to_asset.post_process_file(to_asset.team)
|
to_asset.post_process_file(to_asset.team)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def file_service_url
|
||||||
|
ActiveStorage::Current.set(host: Rails.application.secrets.mail_server_url) do
|
||||||
|
file.service_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def extract_image_quality
|
def extract_image_quality
|
||||||
return unless ['image/jpeg', 'image/pjpeg'].include? content_type
|
return unless ['image/jpeg', 'image/pjpeg'].include? content_type
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,12 @@ class TempFile < ApplicationRecord
|
||||||
|
|
||||||
has_one_attached :file
|
has_one_attached :file
|
||||||
|
|
||||||
|
def file_service_url
|
||||||
|
ActiveStorage::Current.set(host: Rails.application.secrets.mail_server_url) do
|
||||||
|
file.service_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def destroy_obsolete(temp_file_id)
|
def destroy_obsolete(temp_file_id)
|
||||||
temp_file = find_by_id(temp_file_id)
|
temp_file = find_by_id(temp_file_id)
|
||||||
|
|
|
@ -102,6 +102,12 @@ class TinyMceAsset < ApplicationRecord
|
||||||
image.variant(resize_to_limit: Constants::LARGE_PIC_FORMAT)
|
image.variant(resize_to_limit: Constants::LARGE_PIC_FORMAT)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def file_service_url
|
||||||
|
ActiveStorage::Current.set(host: Rails.application.secrets.mail_server_url) do
|
||||||
|
image.service_url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.delete_unsaved_image(id)
|
def self.delete_unsaved_image(id)
|
||||||
asset = find_by(id: id)
|
asset = find_by(id: id)
|
||||||
asset.destroy if asset && !asset.saved
|
asset.destroy if asset && !asset.saved
|
||||||
|
|
|
@ -293,12 +293,7 @@ module Reports::Docx::PrivateMethods
|
||||||
end
|
end
|
||||||
|
|
||||||
def image_path(asset)
|
def image_path(asset)
|
||||||
image = if asset.class == Asset
|
asset.file_service_url
|
||||||
asset.file
|
|
||||||
else
|
|
||||||
asset.image
|
|
||||||
end
|
|
||||||
image.service_url
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def calculate_color_hsp(color)
|
def calculate_color_hsp(color)
|
||||||
|
|
|
@ -8,7 +8,7 @@ class SpreadsheetParser
|
||||||
file_path = file.path
|
file_path = file.path
|
||||||
else
|
else
|
||||||
filename = file.filename.to_s
|
filename = file.filename.to_s
|
||||||
file_path = file.service_url
|
file_path = file.file_service_url
|
||||||
end
|
end
|
||||||
|
|
||||||
case File.extname(filename)
|
case File.extname(filename)
|
||||||
|
|
Loading…
Reference in a new issue