Как загрузить ZIP-файл по HTTP-сообщению с помощью VBA?

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

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

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

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

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

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

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

Способ 2: WinHTTP

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

Способ 3: автоматизировать IE с помощью SendKeys

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

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

Метод 1 следующий в очереди.

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

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

1 ответ

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

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

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

Другие вопросы по тегам