I am working on building an API front end for a 3rd Party API. In addition to collecting the file from my user, I also need to post the file to the 3rd Party Service.
The only way I have been able to get the actual file contents is to download it again after it has been saved.
class Template < ApplicationRecord
has_one_attached :pv_file
…
post_body << self.pv_file.blob.download
``
I want to have a before create filter that throws an error if the 3rd Party API rejects the file (e.g. wrong format, service unavailable, etc), but the only way I have found to access the file content is by downloading it again.
How can we access the actual file content before it has been saved and uploaded?
I’m not a core team member, but I believe that there’s currently no documented way of accessing a file before the record has been saved (more precisely, before the after_commit callback). There is, however, attachment_changes hash, which keeps track of what changes are made. You should be able to access the attachment with record.attachment_changes['pv_file']. Keep in mind that this is undocumented internal api, so it could change in the future.
In you examples, you are trying to download file from a storage service to a tempfile before it has been uploaded, so storage service fails to locate it.