2014-09-12 6 views
0

Je tente de supprimer un répertoire Amazon S3 après l'exécution de l'action destroy sur mon contrôleur.Suppression du répertoire Amazon S3

contrôleurs \ videos_controller.rb:

def destroy 
    @video = Video.find(params[:id]) 
    @video.destroy 
    redirect_to videos_path, notice: "The video #{@video.name} has been deleted." 
end 

modèles \ video.rb:

after_destroy :remove_S3_directory 

def remove_S3_directory 
    path_to_be_deleted = "https://s3.amazonaws.com/bucket/uploads/video/attachment/(ID of the video)" 
    FileUtils.remove_dir(path_to_be_deleted, :force => true) 
end 

Comment puis-je spécifier un path_to_be_deleted sans hardcoding le chemin?

+0

quel champ contient de la vidéo? –

+0

@ShamsulHaque - "attachment" est le champ qui contient le fichier vidéo. Actuellement, mes vidéos sont stockées à "http://s3.amazonaws.com/bucket_name/uploads/video/attachment/1", avec "1" étant l'identifiant unique de la vidéo dans le db. J'ai besoin de supprimer le répertoire dans lequel réside la vidéo. – Vee

Répondre

1

j'ai fini d'installer le joyau aws-sdk d'Amazon (joyau carrierwave-sdk travaillera également au lieu de aws- sdk) et la méthode AWS delete_all pour supprimer tous les fichiers en fonction d'un préfixe. Le format à utiliser cette méthode est la suivante:

s3.buckets[ENV['AWS_BUCKET']].objects.with_prefix('uploads/video/attachment/1/').delete_all 

Ainsi, j'ai mis le code suivant dans mon contrôleur:

def destroy 
    @video = Video.find(params[:id]) 

    # Manipulating the string that points to the path under "bucket" 
    directory_to_be_deleted = File.dirname(@video.attachment.url) 
    bucket = ENV['AWS_BUCKET'] + '/' 
    directory_to_be_deleted = directory_to_be_deleted.split(bucket)[1] 
    directory_to_be_deleted = directory_to_be_deleted + '/' 

    # Use Amazon APIs to remove directory 
    s3 = AWS::S3.new(:access_key_id => ENV['AWS_KEY_ID'], :secret_access_key => ENV['AWS_KEY_VALUE']) 
    s3.buckets[ENV['AWS_BUCKET']].objects.with_prefix(directory_to_be_deleted).delete_all 

    @video.destroy 
    redirect_to videos_path, notice: "The video #{@video.name} has been deleted." 
end 

Je suppose que la plupart de ce code appartient au modèle au lieu du contrôleur mais cela fonctionne donc pour l'instant, je vais le garder tel quel.

0

Essayez de cette façon: -

Dans les contrôleurs \ videos_controller.rb:

def destroy 
    @video = Video.find(params[:id]) 
    vid = @video 
    @video.destroy 
    path_to_be_deleted = vid.attachment 
    FileUtils.remove_dir(path_to_be_deleted, :force => true) 
    redirect_to videos_path, notice: "The video #{vid.name} has been deleted." 
end 
+0

Merci d'avoir essayé, mais cela n'a pas fonctionné. Un des fichiers a été supprimé mais le répertoire est resté intact. Le dossier doit-il être vide pour être supprimé? – Vee

+0

juste supprimé tous les fichiers dans le répertoire S3 avant d'appeler l'action de destruction dans le contrôleur, mais n'a pas fait de différence; le répertoire sur Amazon n'a pas été supprimé. – Vee

+0

Que voulez-vous dire par 'Est-ce que le dossier doit être vide pour être supprimé?' –