J'ai implémenté la fonction pour télécharger le CSV créé par Rails vers S3 l'autre jour. J'ai eu plus de considération que prévu, je vais donc résumer le contenu.
Rails 5.2.3 Ruby 2.6.3
Je ne m'attends pas à vérifier CSV dans Excel
Vous devez installer le gem pour accéder à AWS à partir de Rails. Ajoutez ce qui suit à votre Gemfile:
Gemfile
gem 'aws-sdk', '~> 3'
Je voulais utiliser la fonction de sortie CSV créée cette fois comme logique commune, alors créez un fichier appelé ʻoutput_csv.rb dans
/ app / lib`.
Définissez la classe dans output_csv.rb comme suit.
Toutes les méthodes de cette classe doivent être des méthodes de classe.
app/lib/output_csv.rb
require 'csv'
require 'nkf'
class OutputCsv
class << self
#Ajoutez des méthodes ici
end
end
Créez une méthode à exporter vers S3. La chaîne de caractères CSV reçue en tant que paramètre est sortie vers S3. La partie de création de chaîne de caractères CSV sera décrite plus loin.
app/lib/output_csv.rb
#Méthode de sortie CSV-- ①
def save_csv(data)
#Le nom du fichier est'Chaîne aléatoire_Horodatage.csv'À
file_name = "#{SecureRandom.urlsafe_base64(9)}_#{Time.current.strftime('%Y%m%d%H%M%S')}.csv"
#Sortie dans un dossier nommé csv directement sous le compartiment
file_full_path = "csv/#{file_name}"
#Sortie CSV localement dans l'environnement de développement et vers S3 dans l'environnement de production-- ②
if Rails.env.development?
File.open(Rails.root.join('tmp', file_name), 'w') do |f|
#Convertir le code de caractère à l'aide de NKF-- ③
f.puts(NKF.nkf('-x -w', data))
end
else
#Instanciation du client S3-- ④
s3 = Aws::S3::Client.new
#Sortie CSV vers S3-- ⑤
s3.put_object(bucket: ENV['AWS_S3_BUCKET'],
key: file_full_path,
body: NKF.nkf('-x -w', data),
content_type: 'text/csv')
end
end
(1) Définition de la méthode de sortie CSV. Reçoit la chaîne de caractères CSV à afficher en tant que paramètre (données).
def save_csv(data)
(2) Cette fois, la sortie est effectuée localement dans l'environnement de développement et vers S3 dans l'environnement de production. Si vous souhaitez sortir vers S3 même dans l'environnement de développement, cette branche est inutile.
③ La chaîne de caractères est convertie en utilisant NKF.
f.puts(NKF.nkf('-x -w', data))
Les premiers arguments -x et -w spécifient les conversions suivantes. -x: Sortie sans conversion d'un katakana demi-largeur en katakana pleine largeur -w: sortie avec utf-8
(4) Création d'une instance de client S3. Utilisez ceci pour accéder à S3.
s3 = Aws::S3::Client.new
Notez que nous n'avons passé aucun paramètre au constructeur ici. La raison en est que le rôle de l'instance EC2 sur laquelle cette application Rails s'exécute a l'autorisation d'écrire dans S3, il n'est donc pas nécessaire de considérer l'autorisation.
Si vous souhaitez accéder à S3 avec des privilèges d'utilisateur IAM au lieu de rôles, vous devez spécifier la clé d'accès et la clé secrète comme indiqué ci-dessous.
s3 = Aws::S3::Client.new(
access_key_id: 'your_access_key_id',
secret_access_key: 'your_secret_access_key'
)
⑤ Créez un fichier CSV sur S3.
s3.put_object(bucket: ENV['AWS_S3_BUCKET'],
key: file_full_path,
body: NKF.nkf('-x -w', data),
content_type: 'text/csv')
J'utilise une méthode appelée put_object. Le contenu de chaque paramètre est le suivant.
-Bucket: le nom du bucket à afficher. Ici, la description est basée sur l'hypothèse que la variable d'environnement ʻAWS_S3_BUCKET` est définie. -Key: Spécifiez le nom du répertoire de sortie + le nom du fichier. -Body: génère la chaîne de caractères convertie par NKF expliquée ci-dessus. -Content_type: Le format de fichier est spécifié. Si vous ne spécifiez pas explicitement qu'il s'agit d'un fichier csv ici, il ne sera pas reconnu en tant que fichier CSV sur S3.
Créez une chaîne de caractères CSV, transmettez la chaîne de caractères créée à la méthode save_csv créée ci-dessus et créez une méthode pour générer un fichier CSV.
La méthode à créer reçoit les éléments d'en-tête et les éléments de données en tant que paramètres, les convertit en chaînes de caractères CSV et les génère sous forme de fichier.
app/lib/output_csv.rb
#Méthode de création de chaîne CSV-- ①
def execute(headers, values)
output = CSV.generate do |csv|
#Sortie d'en-tête-- ②
csv << headers
#Sortie des éléments de données-- ③
values.each do |value|
csv << value
end
end
#Sortie de fichier CSV-- ④
save_csv(output)
end
(1) Définition de la méthode de création de chaînes de caractères CSV. Reçoit un tableau d'en-têtes et d'éléments de données en tant que paramètres. Par exemple, si vous souhaitez créer le CSV suivant
id,name,age
1,hoge,20
2,fuga,31
3,foo,43
Créez un tableau comme celui ci-dessous et transmettez-le aux paramètres.
#entête
headers = ['id', 'name','age']
#élément de données
values = []
values.push([1, 'hoge', 20])
values.push([2, 'fuga', 31])
values.push([3, 'foo', 43])
OutputCsv.execute(headers, values)
(2) La valeur de l'en-tête reçue par le paramètre est définie en CSV.
(3) La donnée reçue par le paramètre est définie en CSV. Puisqu'il s'agit d'un tableau, il est retiré et défini ligne par ligne.
(4) Passez la chaîne de caractères CSV créée à la méthode save_csv créée ci-dessus et envoyez-la à S3.
Tout le code est ci-dessous. La méthode save_csv n'est pas censée être appelée de l'extérieur, elle est donc rendue privée.
app/lib/output_csv.rb
require 'csv'
require 'nkf'
class OutputCsv
class << self
def execute(headers, values)
output = CSV.generate do |csv|
#Sortie d'en-tête
csv << headers
#Sortie des éléments de données
values.each do |value|
csv << value
end
end
#Sortie de fichier CSV
save_csv(output)
end
private
def save_csv(data)
#Le nom du fichier est'Chaîne aléatoire_Horodatage.csv'À
file_name = "#{SecureRandom.urlsafe_base64(9)}_#{Time.current.strftime('%Y%m%d%H%M%S')}.csv"
#Sortie dans un dossier nommé csv directement sous le compartiment
file_full_path = "csv/#{file_name}"
#Sortie CSV localement dans l'environnement de développement et vers S3 dans l'environnement de production
if Rails.env.development?
File.open(Rails.root.join('tmp', file_name), 'w') do |f|
#Convertir le code de caractère à l'aide de NKF
f.puts(NKF.nkf('-x -w', data))
end
else
#Instanciation du client S3
s3 = Aws::S3::Client.new
#Sortie CSV vers S3
s3.put_object(bucket: ENV['AWS_S3_BUCKET'],
key: file_full_path,
body: NKF.nkf('-x -w', data),
content_type: 'text/csv')
end
end
end
end
Exportez le fichier vers S3.
headers = ['id', 'name','age']
values = []
values.push([1, 'AIUEO', 20])
values.push([2, 'Kakikukeko', 31])
values.push([3, 'SA Shi Su Se So', 43])
OutputCsv.execute(headers, values)
Le fichier CSV sera généré dans le compartiment et le répertoire spécifiés, comme indiqué ci-dessous.
Si vous téléchargez la sortie du fichier sur S3 et vérifiez le contenu, ce sera comme suit.
Recommended Posts