2015-11-19 4 views
0

Я пытаюсь загрузить файлы с веб-страницы javascript на сервер на основе python с помощью websockets.Сохранение загруженного двоичного файла в локальный файл

В JS, это то, как я передачи пакета данных через WebSocket:

var json = JSON.stringify({ 
    'name': name, 
    'iData': image 
}); 

в питона, я его расшифровке, как это:

noJson = json.loads(message) 
fName = noJson["name"] 
fData = noJson["iData"] 

I знаете, что fData находится в формате Unicode, но когда я пытаюсь сохранить файл локально, это когда проблемы начинаются. Скажем, я пытаюсь загрузить/сохранить файл JPG. Глядя на этот файл после загрузки, я вижу в начале:

ÿØÿà^@^PJFIF 

исходный код должен быть:

<FF><D8><FF><E0>^@^PJFIF 

Так как я могу получить его, чтобы сохранить с кодами, вместо интерпретируемых символов Юникода ?

fd = codecs.open(fName, encoding='utf-8', mode='wb') ## On Unix, so the 'b' might be ignored 
fd.write(fData) 
fd.close() 

(если я не использую «кодирование =» бит, он выдает исключение UnicodeDecodeError)

+0

Я не эксперт по javascript, но я думаю, вам нужно закодировать двоичный код с чем-то вроде base64, чтобы загрузить его. – tdelaney

+0

Взгляните на обсуждение здесь: http://stackoverflow.com/questions/1443158/binary-data-in-json-string-something-better-than-base64 – roeland

ответ

0

Используйте 'latin-1' кодировку для сохранения файла.

fData, которое вы получаете, уже имеет символы, закодированные, то есть вы получаете строку u'\xff\xd8\xff\xe0^@^PJFIF'. Кодирование latin-1 буквально преобразует все кодовые точки между U + 00 и U + FF в один символ и не сможет преобразовать любой кодовый номер выше U + FF.

+0

Это то, что сработало. Благодарю. В моем питоне, я обновил строки файла труб к этому: 'FD = codecs.open (FULLNAME, кодировка = 'латина-1', режим = "термометр") fd.write (FData)' и без изменение Javascript, файлы были сохранены правильно. Пробовал несколько разных изображений, а также видео со всеми успехами. Еще раз спасибо. – snowwolf75

Смежные вопросы