Отправьте файл с помощью POST из сценария Python

Несмотря на то, что у меня нет zabbix, я пытаюсь просто выполнить cmd-файл, который не выполняет ничего, кроме echo %1, я также обнаружил, что chcp 65001 не сработал так, как ожидалось.

По-видимому, выполнение chcp 65001 только устанавливает для OutputEncoding консоли значение UTF-8, что недостаточно. Вы также должны изменить собственный PowerShells $OutputEncoding (который также подразумевает использование chcp 65001).

Чтобы заставить PowerShell использовать UTF-8 при взаимодействии с внешними утилитами, для меня работал следующий код:

$oldOutputEncoding = $OutputEncoding
$oldConsoleEncoding = [Console]::OutputEncoding

# change the output encoding to use UTF-8
$OutputEncoding = New-Object System.Text.Utf8Encoding
[Console]::OutputEncoding = New-Object System.Text.Utf8Encoding

$oldConsoleEncoding

# This is where your zabbix related code goes to finally execute the zabbix_sender.exe 
# In my test case I'm just running a cmd file that does nothing more then echo the input parameter back to console.
& "D:\blah.cmd" "русский"

# switch back to the original output encoding whe finished
$OutputEncoding = $oldOutputEncoding
[Console]::OutputEncoding = $oldConsoleEncoding

То же самое можно сделать для [Console]::InputEncoding, если PowerShell должен получать строки UTF8 из внешних приложения.

Вы можете увидеть текущую кодировку для вывода, просто набрав $OutputEncoding в PowerShell. На моей машине это то, что я получаю:

IsSingleByte      : True
BodyName          : iso-8859-1
EncodingName      : West-Europees (Windows)
HeaderName        : Windows-1252
WebName           : Windows-1252
WindowsCodePage   : 1252
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 1252

После выполнения $OutputEncoding = New-Object System.Text.Utf8Encoding это показывает это:

BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
HeaderName        : utf-8
WebName           : utf-8
WindowsCodePage   : 1200
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 65001

Надеюсь, это поможет

7
задан Community 23 May 2017 в 10:27
поделиться

2 ответа

PyCURL обеспечивает интерфейс для ЗАВИХРЕНИЯ из Python.

http://curl.haxx.se/libcurl/python/

Завихрение сделает все, в чем Вы нуждаетесь. Это может передать двоичные файлы правильно и поддерживает много кодировок. Однако необходимо удостовериться что надлежащая кодировка символов как пользовательский заголовок при РЕГИСТРАЦИИ файлов.

А именно, Вы, возможно, должны сделать, 'загрузка файла' разрабатывает POST:

http://curl.haxx.se/docs/httpscripting.html (Раздел 4.3)

С завихрением (или любой другой клиент HTTP) Вам, вероятно, придется установить довольное кодирование:

Тип контента: текст/HTML; charset=UTF-8

Кроме того, знайте, что заголовки запроса должны быть ASCII, и это включает URL (поэтому удостоверьтесь, что Вы правильно выходите из Вашего возможно unicode URL. Существуют Escape unicode для HTTP-заголовков), Это было недавно зафиксировано в Python:

http://bugs.python.org/issue3300

Я надеюсь, что это помогает, существует больше информации о теме, включая установку Вашего набора символов по умолчанию на Вашем сервере, и т.д.

1
ответ дан 7 December 2019 в 07:52
поделиться

Лучшая вещь, о которой я могу думать, состоит в том, чтобы закодировать его самостоятельно. Как насчет этой подпрограммы?

from urllib2 import Request, urlopen
from binascii import b2a_base64

def b64open(url, postdata):
  req = Request(url, b2a_base64(postdata), headers={'Content-Transfer-Encoding': 'base64'})
  return urlopen(req)

conn = b64open("http://www.whatever.com/script.cgi", u"Liberté Égalité Fraternité")
# returns a file-like object

(Хорошо, таким образом, этот код просто отправляет данные POST. Но Вы, по-видимому, хотите многослойно закодированные данные, как будто Вы нажали кнопку "Upload File", правильно? Ну, это - довольно простая комбинация того, что я имею здесь и ответы от вопроса, который Вы связали.)

5
ответ дан 7 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: