2013-12-07 9 views
6

È possibile caricare un file in una determinata pagina utilizzando PhantomJS senza inviare manualmente il modulo? Penso che qualcosa sia possibile usando il Content-Type: multipart/form-data.PhantomJS - Carica un file senza inviare un modulo

L'esempio su https://github.com/ariya/phantomjs/blob/master/examples/imagebin.js funziona correttamente, ma voglio inviare direttamente il file nella richiesta POST senza interagire con alcun elemento.

Qualche suggerimento?

La ringrazio molto

+0

Hai trovato qualche soluzione a questo? – themiurgo

+0

@Ros: sembrava che tu avessi l'inizio di una possibile risposta lì, per favore vedi se riesci a riformulare la frase in modo più chiaro. –

risposta

3

upload di file può essere fatto su AJAX (come di xhr2 - se è necessario supportare i vecchi browser, usare qualcosa come jQuery-File-Upload, c'è a good tutorial here di utilizzarlo solo per fare la parte di upload, e non usando l'interfaccia utente di Blueimp.) Questo è correlato alla parte "senza inviare manualmente il modulo" della tua domanda. Sarà comunque necessario interagire con un elemento di caricamento file per scegliere il file, ed è qui che si utilizza page.uploadFile().

Per eseguire esclusivamente da JavaScript, senza "interagire con alcun elemento sulla pagina", è possibile utilizzare page.evaluate() per eseguire alcuni JavaScript personalizzati. Potrebbe quindi utilizzare File Reader API per trovare il file sul disco locale, archiviarlo in un blob, quindi caricare il blob su AJAX. Il WebKit in PhantomJS (più o meno equivalente a Chrome 13) dovrebbe funzionare, poiché apparentemente l'API FileReader è presente da Chrome 6.

(BTW, se tutto ciò che si vuole fare è caricare un file su un server usando uno script senza testa , PhantomJS è eccessivo e potresti usare curl. Ma suppongo che tu voglia usare PhantomJS per qualche altra ragione!)

+1

Si prega di avere le buone maniere per commentare quando downvoting. (Ho appena riletto questa risposta e continuo a pensare che non sia solo una buona risposta, ma quella giusta: ho avuto lo stesso problema dell'OP e ho usato tutti e tre i miei suggerimenti in vari momenti. Quindi sono molto curioso di sapere di più sul perché pensi che sia sbagliato.) –

0

La soluzione che ho usato alla fine è un mix di NodeJS e PhantomJS, nel caso Ho bisogno di caricare qualcosa I fork un processo e caricare il file (s) utilizzando il modulo "richiesta" NodeJS e quindi inviare a PhantomJS l'output della pagina, che devono essere elaborati manualmente.