2017-08-24 4 views
0

Donc j'utilise Multi-part gem pour télécharger des données de formulaire en plusieurs parties. Et j'ai des tableaux, y compris les chemins de fichiers, les noms de fichiers et les types de fichiers.Puis-je utiliser la boucle pour télécharger plusieurs fichiers via multipart :: post gem

Depuis que je veux télécharger plusieurs fichiers, j'utilise .each à boucle à travers ces tableaux et essayer de construire certaines commandes comme

"file1" => UploadIO.new(File.new('/tmp/1.jpg'), 'image/jpeg', '1.jpg'), 
"file2" => UploadIO.new(File.new('/tmp/2.jpg'), 'image/jpeg', '2.jpg'), 
"file3" => UploadIO.new(File.new('/tmp/3.jpg'), 'image/jpeg', '3.jpg') 

Et voici mon essai:

filepath = ['/tmp/1.jpg','/tmp/2.jpg','/tmp/3.jpg'] 
filetype = ['image/jpeg','image/jpeg','image/jpeg'] 
filename = ['1.jpg','2.jpg','3.jpg'] 

require 'net/http/post/multipart' 
    url = URI.parse("https://example.com/api/send") 
    req = Net::HTTP::Put::Multipart.new url.path, 
     filepath.each_with_index do |(key, value),index| 
      fileorder = "file" + (key+1).to_s 
      lastfile = "file"+ (filepath.size).to_s 
      fileorder => UploadIO.new(File.new(value), filetype[value], filename[value]), 
      if index == filepath.size - 1 
       lastfile => UploadIO.new(File.new(value), filetype[value], filename[value]) 
      end 
     end 
    req.basic_auth("username", "password") 
    http = Net::HTTP.new(url.host, url.port) 
    http.use_ssl = (url.scheme == "https") 
    res = http.request(req) 

et il sera donnez-moi l'erreur msg:

erreur de syntaxe, inattendu tASSOC, attendez keyword_end
fileorder => UploadIO.new (File.new (valeur) ...

erreur de syntaxe, inattendue '', attente keyword_end ... etype [value], nom de fichier [value]),

erreur de syntaxe, tASSOC inattendue, attendant keyword_end

LastFile => UploadIO.new (File.new (valeur) ...

Répondre

1

Je vais vous diriger dans la bonne direction, car il me prendra un certain temps mettre en place tout pour que votre code fonctionne. D'abord vous avez une erreur de syntaxe, donc je vous recommande d'installer un plugin/extension pour votre éditeur qui vérifie la syntaxe de votre code lorsque vous enregistrez le fichier. (Je sais par expérience que votre message d'erreur est une erreur de syntaxe, mais le plugin m'a montré exactement où ça se passe).

Deuxièmement, vous ne pouvez pas faire le calcul dynamique que vous voulez en Ruby, donc vous devez d'abord construire le hachage et passer ensuite comme un argument:

Essayez quelque chose le long de ces lignes:

url = URI.parse("https://example.com/api/send") 

files = {} 
filepath.each_with_index do |(key, value),index| 
    # ... calculate your values 
    files["file#{index}"] = UploadIO.new(File.new("./#{key}.#{value}"), "image/jpeg", "#{key}.#{value}") 
    # {} will become { "file1" => UploadIO.new(File.new("./image.jpg"), "image/jpeg", "image.jpg") } 
end 

# "files" hash will be something like this 
# { 
# "file1" => UploadIO.new(File.new("./image1.jpg"), "image/jpeg", "image1.jpg"), 
# "file2" => UploadIO.new(File.new("./image2.jpg"), "image/jpeg", "image2.jpg"), 
# "file3" => UploadIO.new(File.new("./image3.jpg"), "image/jpeg", "image3.jpg") 
#} 
req = Net::HTTP::Put::Multipart.new(url.path, files) 

req.basic_auth("username", "password") 
http = Net::HTTP.new(url.host, url.port) 
http.use_ssl = (url.scheme == "https") 
res = http.request(req) 
+0

Merci , en utilisant Hash a fait le travail. Merci beaucoup. – lilixiaocc