Created
August 30, 2020 14:46
-
-
Save elliott-king/12bc6c9ff9a69b5f04d74ebb263ba702 to your computer and use it in GitHub Desktop.
Creates a URL for an Active Storage direct upload
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class DirectUploadController < ApplicationController | |
def create | |
response = generate_direct_upload(blob_params) | |
render json: response | |
end | |
private | |
def blob_params | |
params.require(:file).permit(:filename, :byte_size, :checksum, :content_type, metadata: {}) | |
end | |
def generate_direct_upload(blob_args) | |
blob = create_blob(blob_args) | |
response = signed_url(blob) | |
response[:blob_signed_id] = blob.signed_id | |
response | |
end | |
def create_blob(blob_args) | |
blob = ActiveStorage::Blob.create_before_direct_upload!(blob_args.to_h.deep_symbolize_keys) | |
pdf_id = SecureRandom.uuid # the name of the file will just be a UUID | |
blob.update_attribute(:key, "uploads/#{pdf_id}") # will put it in the uploads folder | |
blob | |
end | |
def signed_url(blob) | |
expiration_time = 10.minutes | |
response_signature( | |
blob.service_url_for_direct_upload(expires_in: expiration_time), | |
headers: blob.service_headers_for_direct_upload | |
) | |
end | |
def response_signature(url, **params) | |
{ | |
direct_upload: { | |
url: url | |
}.merge(params) | |
} | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment