casperjs скачать файл без указания URL
Есть ли способ загрузить CSV-файл с помощью casperjs без указания URL-адреса для загрузки? Я пытаюсь загрузить файл CSV, URL-адрес которого генерируется динамически при нажатии кнопки загрузки. Таким образом, я не могу использовать download() в этой ситуации.
4 ответа
Для записи, это уже возможно, используя событие resource.received. Если вы получили заголовок, как этот:
Содержание-Диспозиция: Приложение; Имя файла ="ExportData.csv"
Сгенерированный файл можно загрузить с помощью следующего прослушивателя событий:
casper.on('resource.received', function(resource) {
if (resource.stage !== "end") {
console.log("resource.stage !== 'end'");
return;
}
if (resource.url.indexOf('ExportData.csv') > -1) {
console.log("Downloading csv file");
this.download(resource.url, 'ExportData.csv');
}
});
Я нашел решение для этого. Это не очень чисто, но это работает:
Вам необходимо создать глобальный массив, который связывает каждый ресурс.receded с прикрепленным именем файла.
fileInfos[url]= parse_filename_from_responseHeader(resource)
Если url - это ресурс, который вы хотите загрузить, попробуйте сначала открыть (url). Это вызовет событие resiyrce.received, проанализирует заголовок и обновит глобальный массив.
Теперь, перед запуском casper.download(url)
, Ищу fileInfos[url]
,
Вы найдете имя файла, соответствующее URL в массиве fileInfos. Я могу уточнить решение, если это необходимо, но поскольку этому вопросу уже несколько лет,
Я подожду следующей попытки прояснить ситуацию.
Это будет невозможно до тех пор, пока проблема phantomjs не будет решена http://code.google.com/p/phantomjs/issues/detail?id=52
Я хотел бы сделать что-то вроде этого, но я знаю имя файла, который я получу:
this.waitForResource(function check(resource){
res = resource;
// regular expression to test
return /thefilename/.test(resource.url);
}, function(){
this.echo("Resource found: " + res.url);
// download the file
this.download(res.url, path);
}, null, 10000);