Как загрузить ZIP-файл по HTTP-сообщению с помощью VBA? - PullRequest
3 голосов
/ 15 октября 2010

Этот вопрос много раз задавался другими в той или иной форме, но большинство оставалось без ответа, или был дан ответ «Используй C #, дух!», Что, кстати, не ответ.; -)

Я хочу загрузить ZIP-файл на веб-сервер через VBA.Код на стороне сервера уже существует и работает хорошо;он принимает zip-файлы посредством ручной загрузки формы и что-то делает с содержимым zip-файла.

Теория заключается в том, что я планирую преобразовать двоичное содержимое zip-файла в строку HTTP-запроса и отправить его всервер с использованием некоторых методов из библиотеки WinHTTP.Если все идет хорошо, сценарий на стороне сервера (на Perl) не сможет определить, пришел ли файл из VBA или из браузера и продолжает ли он нормально работать.

Однако, трансмогрифицируя zip-файл в строку HTTP-запросане кажется очень прямым.

Похоже, что при поиске в Интернете существует 3 общих стратегии:

Метод 1: WinHTTP и ручное кодирование двоичного файла в строку запроса HTTP

  • Включает открытие файла в двоичном режиме и ручное применение некоторой кодировки voodoo для преобразования двоичного потока в строку HTTP-запроса и отправки его по пути с помощью WinHTTP. Страшное количество кода.

Метод 2: WinHTTP

  • Включает использование ADODB.Поток.Менее десяти строк кода.

Метод 3: Автоматизация IE с помощью SendKeys

  • Есть только одно слово, чтобы описать этот взлом: Yuck!И, вероятно, сломается в будущей версии IE, если не уже.Менее десяти строк кода. Риск безопасности.

Я склоняюсь к Метод 2 , однако документация тонкая, примеры кода редкие, и нет уверенности в том, что это работает.Большинство примеров кода неполны и часто содержат комментарии, которые говорят, что они не работают.Этот метод действительно работает?

Следующий в строке метод 1 .

Метод 3 Пожалуйста, нет!(Скорее используйте C #, если дело касается этого. Любите C #, только требования разрешают только VBA)

У кого-нибудь есть какие-нибудь хорошие примеры того, как выполнить эту задачу?

1 Ответ

3 голосов
/ 12 января 2011

После ужасного объема экспериментов со всеми вашими методами, описанными выше (и более), я использую то, что в значительной степени равнозначно вашему "Методу 1" - я использую пункт (2) из ​​http://www.motobit.com/tips/detpg_post-binary-data-url/,, но со следующим назначением:

 Set http = CreateObject("WinHttp.WinHttprequest.5.1")

... вместо того, что предложено в этом коде (я думаю, код немного пожилой). Однако он не идеален - например, я до сих пор не мог заставить его работать на старой машине с Windows XP, которая у меня была (работает нормально на Win7).

...