come leggere un file caricato dall’utente, senza salvarlo nel database

Mi piacerebbe essere in grado di leggere un file XML caricato dall’utente (meno di 100kb), ma non dover prima salvare quel file nel database. Non ho bisogno di quel file oltre l’azione corrente (i suoi contenuti vengono analizzati e aggiunti al database, tuttavia, l’analisi del file non è un problema). Poiché i file locali possono essere letti con:

File.read("export.opml") 

Ho pensato di creare un file_field per: uploaded_file, quindi provare a leggerlo con

 File.read(params[:uploaded_file]) 

ma tutto ciò che viene fatto è un errore TypeError (imansible convertire HashWithIndifferentAccess in String). Ho provato molte cose diverse (inclusa la lettura dalla directory / tmp), ma non riuscivo a far funzionare nessuno di loro.

Spero che la brevità della mia domanda non offuschi lo sforzo che ho dato per cercare di risolvere questo da solo, ma non volevo inquinare questa domanda con un centinaio di modi su come NON farlo. Grazie mille a tutti quelli che suonano.

Ecco la mia opinione:

  {:action=>'parse'}, :html=> {:multipart=>true}) do |f| %> 


Ho impostato un’azione personalizzata (upload) che gestisce il caricamento file_field, che dopo l’invio, viene trasferito a un’altra azione personalizzata (analisi) per l’elaborazione. Potrebbe essere una parte del mio problema?

Sei molto vicino Controlla il tipo di class dei params[:uploaded_file] Tempfile params[:uploaded_file] , dovrebbe essere tipicamente un object StringIO o Tempfile che agiscono entrambi da file e possono essere letti utilizzando i rispettivi metodi di read .

Giusto per essere sicuro (il tipo di class di params[:uploaded_file] può variare a seconda che tu stia utilizzando Mongrel, Passenger, Webrick ecc.) Puoi fare un tentativo leggermente più esauriente:

 # Note: use form validation to ensure that # params[:uploaded_file] is not null file_data = params[:uploaded_file] if file_data.respond_to?(:read) xml_contents = file_data.read elsif file_data.respond_to?(:path) xml_contents = File.read(file_data.path) else logger.error "Bad file_data: #{file_data.class.name}: #{file_data.inspect}" end 

Se, nel tuo caso, risulta che params[:uploaded_file] è un hash, assicurati di aver invertito erroneamente i parametri file_field e method quando file_field nella tua vista, o che il tuo server non ti sta dando un hash con chiavi come :content_type ecc. (in tal caso, per favore, commenta questo post con l’ Bad file_data ... output da development.log / production.log .)

Ho bisogno di leggere i file yaml. Io uso remotipart e qui il codice:

in html.slim

  =form_tag('/locations/check_for_import', method: :post, remote: true, multipart: true) 

  

nel controller

 content = File.read(params[:uploadInput].tempfile) doc = YAML.load(content)