2013-12-07 4 views
6

Можно ли загрузить файл на определенную страницу с помощью PhantomJS без отправки вручную формы? Я думаю, что что-то возможно с использованием Content-Type: multipart/form-data.PhantomJS - Загрузить файл без отправки формы

Пример на https://github.com/ariya/phantomjs/blob/master/examples/imagebin.js работает нормально, но я хочу отправить файл непосредственно в запрос POST без взаимодействия с каким-либо элементом.

Любое предложение?

Большое спасибо

+0

Вы нашли это решение? – themiurgo

+0

@Ros - у вас, казалось, есть начало возможного ответа там, пожалуйста, посмотрите, можете ли вы перефразировать его, чтобы более четко сформулировать свой вывод. –

ответ

3

загрузка файлов может быть сделано через AJAX (как из xhr2 - если вам необходимо поддерживать старые браузеры, использовать что-то вроде jQuery-File-Upload, есть a good tutorial here на его использование только, чтобы сделать часть загрузки, и не использовать пользовательский интерфейс Blueimp.) Это связано с тем, что «без ручной отправки формы» часть вашего вопроса. Вам все равно нужно будет взаимодействовать с элементом загрузки файла, чтобы выбрать файл, и именно там вы используете page.uploadFile().

Чтобы сделать это исключительно с помощью JavaScript, без «взаимодействия с любым элементом на странице», вы можете использовать page.evaluate() для запуска пользовательского JavaScript. Затем он может использовать File Reader API, чтобы найти файл на локальном диске, сохранить его в блобе, а затем загрузить этот блок с помощью AJAX. WebKit в PhantomJS (примерно эквивалентный Chrome 13) должен работать, поскольку, по-видимому, FileReader API существует с Chrome 6.

(BTW, если все, что вы хотели сделать, это загрузить файл на сервер с помощью безголового скрипта , PhantomJS переполнен, и вы можете использовать curl.Но я предполагаю, что вы хотите использовать PhantomJS по какой-то другой причине!)

+1

Просьба иметь хорошие манеры для комментариев при downvoting. (Я только что перечитал этот ответ, и я все еще думаю, что это не просто хороший ответ, но правильный - у меня была такая же проблема, как и у OP, и я использовал все три моих предложения в разное время. Поэтому мне очень любопытно узнать, почему вы думаете, что это неправильно.) –

0

Решение, которое я использовал в конце, представляет собой сочетание NodeJS и PhantomJS, в случае Мне нужно загрузить что-то, что я развил процесс, и загрузить файл (ы) с помощью модуля запроса «NodeJS», а затем отправить обратно на PhantomJS вывод страницы, который необходимо обработать вручную.

Смежные вопросы