简体   繁体   中英

Paperclip - delete a file from Amazon S3?

I need to be able to delete files from S3 that are stored by users, such as profile photos. Just calling @user.logo.destroy doesn't seem to do the trick - I get [paperclip] Saving attachments. in the logs and the file stays right there in the S3 bucket.

How can the file itself be removed?

This are the methods from Paperclip that can be used to remove the attachments:

# Clears out the attachment. Has the same effect as previously assigning
# nil to the attachment. Does NOT save. If you wish to clear AND save,
# use #destroy.
def clear(*styles_to_clear)
  if styles_to_clear.any?
    queue_some_for_delete(*styles_to_clear)
  else
    queue_all_for_delete
    @queued_for_write  = {}
    @errors            = {}
  end
end

# Destroys the attachment. Has the same effect as previously assigning
# nil to the attachment *and saving*. This is permanent. If you wish to
# wipe out the existing attachment but not save, use #clear.
def destroy
  clear
  save
end

So you see, destroy only removes the attachment if no error occurs. I have tried it with my own setup against S3 so I know that destroy works.

Could the problem in your case possible be that you have any validations that cancels the save? Ie validates_attachment_presence or something similar?

I think one way to find out would be to try @user.logo.destroy and then check the content of @user.errors to see if it reports any error messages.

This seems like an answer to your question, although I don't totally understand their distinction between destroy and clear (I don't know which model has_attached_file, page or image):

Rails Paperclip how to delete attachment?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM