7
votes

Où le stockage actif stocke-t-il les fichiers (sur disque) et comment puis-je les récupérer physiquement?

J'utilise le stockage actif avec Rails 5.2. Je suis le guide EdgeRails et j'ai configuré Active-Storage pour utiliser le disque local.

Les téléchargements de fichiers fonctionnent très bien lorsque j'utilise l'application Rails.

Cependant, le problème est que j'ai besoin pour accéder physiquement à ces fichiers téléchargés sans utiliser Rails comme médiateur.

Une requête pour savoir où les fichiers sont stockés renvoie ceci:

url_for(@employee_staff.avatar)
=> "/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBGUT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--e76664d247cb5437fe1cd11f7ee0ded24f95aee2/profilepic3.jpeg"

J'essaye de déterminer où ce chemin de fichier est enregistré sur mon disque local. Jusqu'à présent, je n'ai pas eu de chance.

Toutes les explications sur le fonctionnement d'Active-Storage et où je peux voir les fichiers téléchargés sont grandement appréciées.


5 commentaires

Avez-vous vu le guide ?


Oui, je ne sais toujours pas dans quel répertoire le stockage actif enregistre les fichiers. J'utilise actuellement l'option "Service de disque" spécifiée dans le guide, donc je m'attends à ce que ce soit quelque part dans mon système de fichiers.


Oui, si votre storage.yml ressemble à celui du guide, les fichiers se trouvent dans le dossier de votre projet.


J'ai essayé de trouver le / rails / active_storage / dans mon projet (en utilisant la fonction de recherche de dossier de vscode), je ne vois toujours aucune liste de ce répertoire particulier. J'ai aussi essayé de le chercher physiquement, pas de chance.


Est-ce que cela répond à votre question? Obtenir le chemin du fichier ActiveStorage sur le disque


3 Réponses :


6
votes

Sur votre machine de développement local (puisque vous avez mentionné le disque local), vous devriez avoir un fichier config / storage.yml qui a un bloc similaire à ci-dessous:

Foo.last.photo.blob.key

Dans cet exemple ci-dessus, je stocke les fichiers dans un dossier nommé storage à la racine de mon application rails. Dans ce dossier, vous trouverez des dossiers imbriqués qui ne sont pas destinés à être parcourus via l'explorateur de fichiers / Finder (mais vous pouvez).

Dans votre application de rails, via des vues par exemple, vous utiliseriez le url helpers qui ne sont pas encore bien documentés.

Depuis une console de rails, vous pouvez essayer, pour un modèle nommé Foo , avec un has_one_attached: photo

local:
  service: Disk
  root: <%= Rails.root.join('storage') %>

Cela devrait vous donner une chaîne d'environ 24 caractères.

  • Les 2 premiers caractères sont un sous-dossier dans le dossier que je vous ai indiqué ci-dessus
  • Les 2 caractères suivants sont un sous-dossier à l'intérieur de celui-ci

À l'intérieur du sous-dossier se trouve un fichier dont le nom correspond à la clé que vous avez imprimée ci-dessus (sans extension). C'est votre fichier.


6 commentaires

Alors, les fichiers sont-ils cryptés? Existe-t-il un moyen pour moi de récupérer le fichier de base sans utiliser de code ruby?


Non, ils ne sont pas chiffrés. ActiveStorage change le nom du fichier (basé sur une sorte de hachage je pense) et supprime l'extension, vous verrez donc un tas de fichiers sans extensions dans ces sous-dossiers. Vous devriez pouvoir les ouvrir (au moins sur macOS), mais vous devrez peut-être changer l'extension dans certains cas.


Je l'ai essayé et tu as raison! Existe-t-il un moyen de désactiver ce changement de nom de fichier avec de nouveaux téléchargements, ou de le mapper à son nom d'origine? Je regarde la table de base de données des objets blob de stockage actifs, et elle a une clé et une somme de contrôle pour chaque entrée. Cela a-t-il quelque chose à voir avec cela?


Si vous essayez de désactiver le changement de nom, vous feriez probablement mieux de ne pas utiliser le stockage actif (sauf si j'ai manqué quelque chose dans la documentation). Je pense qu'il renomme les fichiers de cette façon pour des raisons de performances. Vous avez accès au nom de fichier d'origine via les données blob comme je l'ai montré ci-dessus. Vous avez également la possibilité d'obtenir le nom du fichier à l'aide des aides d'URL que j'ai liées. S'il y a un problème spécifique que vous essayez de résoudre, je pourrai peut-être vous fournir des conseils pour le résoudre, mais vous devrez fournir plus de détails sur ce que vous essayez de faire avec les fichiers d'origine


D'accord, merci pour les réponses, cela explique beaucoup mieux les choses. Je ne sais toujours pas pourquoi Active Storage insiste sur des noms de fichiers étranges, mais je suppose que je vais contourner cela d'une manière ou d'une autre. Réponses acceptées.


L'une des raisons pour lesquelles il peut ne pas utiliser les noms de fichiers d'origine est d'autoriser plusieurs fichiers avec le même nom. Par exemple, plusieurs utilisateurs peuvent télécharger un fichier appelé profile.png



0
votes

Si vous avez des variantes:

variant = @employee_staff
            .avatar
            .attachment
            .variant(resize: '100x100')
            .processed # If variant is not processed

variant.service.send(:path_for, variant.key) # Absolute path to variant file


0 commentaires

0
votes
ActiveStorage::Blob.service.path_for(@employee_staff.avatar.key)
As seen in this Answer

0 commentaires