Как программно получить файл, который находится на веб-странице, используя Java - PullRequest
2 голосов
/ 14 февраля 2012

Я пытаюсь загрузить файл (который я считаю приложением Application / OCTET-STREAM) с веб-страницы. URL выглядит как http://REDACTED.com/bb/avfile/filename. Когда я вписываю этот URL в браузер (IE или Firefox), файл загружается нормально, размером 72 КБ, без расширения файла, и его можно открыть с помощью моей программы для работы с электронными таблицами. Когда я пытаюсь загрузить файл через программу Java, он получает файл размером всего 70 КБ, который не открывается в моей программе работы с электронными таблицами. Попытка разобрать файл с помощью org.apache.poi.xssf.usermodel. * Приводит к ошибке «Пакет должен содержать часть типа содержимого [M1.13]», что имеет смысл для меня, так как файл меньше, чем файл, загружаемый из Браузер

Кажется, сервер доставит правильный файл, только если запрос URL поступил из браузера. Вот мой код:

String UrlString = "http://REDACTED.com/bb/avfile/filename";
URL internetURL = new URL(UrlString);
URLConnection internetConnection = internetURL.openConnection();

destinationFile = new File(filePath + "test");
org.apache.commons.io.FileUtils.copyURLToFile (internetURL, destinationFile,2000,2000);

Я попытался привести к httpConnection

HttpURLConnection httpConnection = (HttpURLConnection) new URL(UrlString).openConnection();
httpConnection.setRequestMethod("GET");

Я попытался установить методы setRequestProperty так, чтобы заголовки совпадали с тем, что отображается в HTTPFOX, когда я отправляю URL через браузер, как:

httpConnection.setRequestProperty ("Content-Type","application/vnd.ms-excel");
httpConnection.setRequestProperty ("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1");
// etc,

Также получение файла в виде потока:

destinationFile = new File(filePath + "temp2");
org.apache.commons.io.FileUtils.copyInputStreamToFile
(httpConnection.getInputStream(), destinationFile);

Все методы создают файл, который на 2 КБ меньше файла, загруженного из браузера. Единственное отличие, которое я вижу, это то, что заголовки из браузера, как показывает HTTPFox, показывают строку запроса как «bb / avfile / filenameHTTP1.1» с хостом «REDACTED.com». При добавлении HTTP1.1 к URL-адресу в браузере или в программе создается файл размером 1 КБ, который гласит: «Запрошенное содержимое недоступно». HTTPFox показывает, что нет запросов POST

Я не знаю, как поступить. Любые предложения или идеи о том, что проблема?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2012

Ниже приведены заголовки из Live HTTP Headers (это та же информация из HTTPFox): http://media.bloomberg.com/bb/avfile/rmjBGqgXkPnk

GET / bb / avfile / rmjBGqgXkPnk HTTP / 1.1 Ведущий: media.bloomberg.com Пользователь-агент: Mozilla / 5.0 (Windows NT 5.1; rv: 9.0.1) Gecko / 20100101 Firefox / 9.0.1 Принять: текст / html, приложение / xhtml + xml, приложение / xml; q = 0,9, / ; q = 0,8 Accept-Language: en-us, en; q = 0,5 Accept-Encoding: gzip, выкачать Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7 Подключение: keep-alive Cookie: opt = no-opt; bdfpc = 001.3585249025.1322666901; companypage_tm1 = 1322666901; companypage = 1; __utma = 30057196.1103067570.1328849418.1329111755.1329116018.8; __utmz = 30057196.1328850070.2.2.utmcsr = Google | utmccn = (органический) | utmcmd = органическая | utmctr = (не% 20provided); s_vi = [CS] v1 | 276B25CB851D18E9-4000012F600000A2 [CE]; rsi_segs = K05539_10802 | K05539_10672 | K05539_10444 | K05539_10784 | K05539_10785 | K05539_10632 | K05539_10562 | K05539_10694 | K05539_10284 | K05539_10561 | K05539_10807 | K05539_10668 | K05539_10698 | K05539_10635 | K05539_10645 | K05539_10541 | K05539_10712 | K05539_10585 | K05539_10522 | K05539_10426 | K05539_10384 | K05539_10315 | K05539_10520 | K05539_10429 | K05539_10507 | K05539_10497 | K05539_10466 | K05539_10365 | K05539_10434 | K05539_10451 | K05539_10160 | K05539_10474 | K05539_10479 | K05539_10480 | K05539_10481 | K05539_10491 | K05539_10495 | K05539_10499 | K05539_10366 | K05539_10529 | K05539_10545 | K05539_10136 | K05539_10301 | K05539_10582 | K05539_10591 | K05539_10592 | K05539_10005 | K05539_10627 | K05539_10647 | K05539_10648 | K05539_10682 | K05539_10721 | K05539_10751 | K05539_10758 | K05539_10761 | K05539_10792 | K05539_10793; agent_id = 1d547385-Fe3B-4fdd-847e-15d60dff617c; session_id = b2fa2002-70b5-44c2-b0b7-a10cb53ff6df; session_key = 91363212-f200-5a96-a2d7-a8ddabdbf214; __utmx = +30057196,00013155880168891469: 4: 17; __utmxx = 30057196,00013155880168891469: 1322673451: 2592000; quintTrack = 7339626780942826; __qca = P0-1259442857-1322673325742; morestories201112_tm = 1323712414; morestories201112 = rsch23; oo_inv_reprompt = 1; VWCUKP300 = L0 / Q87869_16825_75_020712_1_022912_526278x525869x020712x1x1; hprec201202_tm = 1328848822; hprec201202 = RD7; __utmv = 30057196 | 1 = recommendation_cookie = RD7 = 1 ^ 2 = morestories201112 = rsch23 = 1 ^ 4 = companypages = 1 = 1 ^ 7 = recommendation_cookie = RD7 = 1. cobdfpc = 010.3213488906.1329116155

HTTP / 1.1 200 OK Сервер: Sun-Java-System-Web-Server / 7.0 Дата: вторник, 14 февраля 2012 г. 05:11:34 GMT Последнее изменение: вторник, 14 февраля 2012 г. 05:05:34 GMT Accept-Ranges: байты Тип контента: application / vnd.ms-excel Контент-кодировка: gzip Edge-Control:! No-store, max-age = 3d Cache-Control: max-age = 86400 Истекает: Ср, 15 февраля 2012 05:11:34 GMT

Длина содержимого: 70743

Загружает файл, который можно открыть с помощью программы Open Office Calc (программа для работы с электронными таблицами). Я не уверен, что ответ Mishas пытается сказать мне, поскольку я не взаимодействую с каким-либо HTML - просто введите адрес http: // в поле URL браузера.

0 голосов
/ 14 февраля 2012

Это может быть возможно (случилось со мной, и никто не поверил мне ...), потому что в HTML может быть что-то, что запрашивает дополнительный HTML. Но для небольшой разницы в 2 КБ это маловероятно. Я подозреваю, что ваш рабочий процесс опирается на некоторые «причуды» в рендеринге HTML Также переход от HTML-> OFFICE - плохая плохая идея, если вы не очистите HTML.

Я бы попробовал очистить HTML с помощью JSOUP и посмотреть, сможете ли вы открыть вывод. Вы хотите простой стол, верно? Какие функции вы надеетесь извлечь из HTML?

Попробуйте это

  1. Попробуйте использовать wget. Убедитесь, что файл, полученный с помощью wget, имеет нужный размер. Если это не нужный размер (wget => 70kb, you_want => 72kb), то в браузере действительно вносятся некоторые важные изменения.

  2. Если это работает в wget, вы убираете часть HTML с помощью сериализации на стороне Java. Это не должно быть проблемой и указывает на проблему с вашим рабочим процессом.

  3. Если он не работает с wget. Это означает, что браузер «исправляет» HTML. Если это так, вам следует определить, что вам нужно исправить и что делает браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...