Имя: Пароль:
1C
 
парсинг файла, лишний пробел http запрос
0 Noxvil
 
13.01.20
16:34
Коллеги, добрый день.

Сделал парсинг файла по примеру https://wonderland.v8.1c.ru/blog/novye-instrumenty-dlya-raboty-s-dvoichnymi-dannymi-obespechivayut-kak-posledovatelnyy-dostup-k-danny/
Ранее писал по этому поводу вопрос парсинг form-data body http-запроса ?

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

"------WebKitFormBoundarycpdsNJbUO3brgUUX
Content-Disposition: form-data; name="1.txt"

1
2
3
------WebKitFormBoundarycpdsNJbUO3brgUUX--
"

У кого была подобная ошибка?
Что делали в этом случае?
1 Garykom
 
гуру
13.01.20
16:56
(0) Знаем в чем разница между виндовс и линукс стайл в переносах строк?
2 Noxvil
 
13.01.20
17:08
(1) Вместе с тобой - возможно, расскажи
3 Garykom
 
гуру
13.01.20
17:11
https://qna.habr.com/q/257857
https://stackoverflow.com/questions/1552749/difference-between-cr-lf-lf-and-cr-line-break-types

Прикольно что что все три операционки Win|Lin|Mac имеют разный дефолтный перенос строк.
Поубивав бы этих каждый со своей головкой и хрен биту для отвертки найдешь.
4 pechkin
 
13.01.20
17:12
(3) а раньше еще и кодировки разные были
5 Garykom
 
гуру
13.01.20
17:14
(4) Это фигня. РеГиСтРоЗаВиСиМоСтЬ в linux это прикольно.
6 Garykom
 
гуру
13.01.20
17:16
(5)+ И прикольно когда разные файлы:
aa.txt
aA.txt
Aa.txt
AA.txt
пытаются с линукса на виндовс скопировать ))
7 Noxvil
 
13.01.20
17:18
(3)
Ок, если проблема с символами переноса строк - какое решение моей проблемы?
Убрать первые несколько байт в файле в формате переноса?
8 Noxvil
 
13.01.20
17:19
(3)
Перенос у меня через postman тоже присутствует
9 Garykom
 
гуру
13.01.20
17:21
(7) (8) Там специально в формате HTML оговаривается указание длины файла, просто при сборке надо сверить и понятно сразу правильно или нет собрали/получили
10 Noxvil
 
13.01.20
17:26
(9) Там - это где?
Я делаю запрос через postman и в formdata выбираю файл.
Мне как через объект ЧтениеДанных удалить лишний перенос строк?
11 Garikk
 
13.01.20
17:29
(6) самый прикол создать эти файлы в линуксе, закинуть в гит, а в винде вытянуть репу и попробовать чтото там поредактировать
12 Noxvil
 
13.01.20
17:43
Вопрос актуален
13 Garykom
 
гуру
13.01.20
17:46
(12) Ты код то уже покажи или что там у тя. Пока не очень понятно на каком этапе проблема возникает.
Может кодируется при отправке файл не правильно, может декодируется а может еще в чем проблема.
14 Noxvil
 
13.01.20
17:50
(13) Код аналогичный примеру 1с по ссылке https://wonderland.v8.1c.ru/blog/novye-instrumenty-dlya-raboty-s-dvoichnymi-dannymi-obespechivayut-kak-posledovatelnyy-dostup-k-danny/

Функция ПолучитьСтруктуруПараметров(Заголовки, ДвоичныеДанныеТело) Экспорт
        
    Разделитель = ПолучитьРазделительСоставногоСообщения(Заголовки);
        
    Маркеры = Новый Массив();
    Маркеры.Добавить("--" + Разделитель);
    Маркеры.Добавить("--" + Разделитель + Символы.ПС);
    Маркеры.Добавить("--" + Разделитель + Символы.ВК);
    Маркеры.Добавить("--" + Разделитель + Символы.ВК + Символы.ПС);
    Маркеры.Добавить("--" + Разделитель + "--");
    Маркеры.Добавить("" + Разделитель + "--");
    Маркеры.Добавить("" + Разделитель + "");
    
    СтруктураПараметров = Новый Структура();
    
    ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанныеТело);
    
    Размер = ДвоичныеДанныеТело.Размер();
    
    // Переходим к началу первой части.
    ЧтениеДанных.ПропуститьДо(Маркеры);
    
    // Далее в цикле читаем все части.
    Пока Истина Цикл
        РезультатЧтенияЧасть = ЧтениеДанных.ПрочитатьДо(Маркеры);
        
        Если Не РезультатЧтенияЧасть.МаркерНайден Тогда
            
            // Неправильно сформированное сообщение.
            Прервать;
            
        КонецЕсли;
        
        ЧтениеЧасти = Новый ЧтениеДанных(РезультатЧтенияЧасть.ОткрытьПотокДляЧтения());
        ЗаголовкиЧасти = ПрочитатьЗаголовки(ЧтениеЧасти);
        //ИмяЧасти       = ПолучитьИмяСообщения(ЗаголовкиЧасти);
        ИмяФайла       = ЗаголовкиЧасти["filename"];
            
        Если ИмяФайла = Неопределено Тогда
        
            ЗначениеТекстовогоПоля = ЧтениеЧасти.ПрочитатьСимволы();
            ЗначениеТекстовогоПоля = СтрЗаменить(ЗначениеТекстовогоПоля,Символы.ПС,"");
            ЗначениеТекстовогоПоля = СтрЗаменить(ЗначениеТекстовогоПоля,Символы.ВК,"");        
            
            СтруктураПараметров.Вставить("File",ЗначениеТекстовогоПоля);
            
        Иначе
            
            
            СтруктураФайла = Новый Структура();
            СтруктураФайла.Вставить("ИмяФайла",ИмяФайла);
            СтруктураФайла.Вставить("ДвоичныеДанные",ЧтениеЧасти.Прочитать().ПолучитьДвоичныеДанные());
            
            СтруктураПараметров.Вставить("File",СтруктураФайла);
            
        КонецЕсли;
                
        Если РезультатЧтенияЧасть.ИндексМаркера = 4 Тогда
            
            // Прочитали последнюю часть.
            Прервать;
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат СтруктураПараметров;
    
КонецФункции

Функция ПолучитьРазделительСоставногоСообщения(Заголовки)
    ТипСодержимого = Заголовки.Получить("Content-Type");
    
    Свойства = СтрРазделить(ТипСодержимого, ";", Ложь);
    Граница = Неопределено;
    
    Для Каждого Свойство Из Свойства Цикл
        Части = СтрРазделить(Свойство, "=", Ложь);
        ИмяСвойства = СокрЛП(Части[0]);
        
        Если ИмяСвойства <> "boundary" Тогда
            
            Продолжить;
            
        КонецЕсли;
        
        Граница = СокрЛП(Части[1]);
        
        Прервать;
        
    КонецЦикла;
        
    Возврат Граница;
    
КонецФункции
15 Garykom
 
гуру
13.01.20
17:55
(14) Content-Length в заголовках есть?

И у тебя маркеры иные по сравнению с кодом в стране чудес
16 Noxvil
 
13.01.20
18:04
(15)

Есть, 210
Маркеры другие, т.к. boundaryу постмана "boundary=--------------------------026589971661009849135567"
17 Garykom
 
гуру
13.01.20
18:18
(16) Все равно кривые какие то маркеры, особенно последних два
18 Noxvil
 
13.01.20
18:24
(17) Ещё раз, постман делает разделители в виде "--"

----------------------------635697881359966015888745
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: text/plain

1
2
3
----------------------------635697881359966015888745--

Вот пример файла.
Есть понимание, как можно правильно разбить файл через объект чтение данных?
19 Garykom
 
гуру
13.01.20
18:30
Маркеры = Новый Массив();
    Маркеры.Добавить("--" + Разделитель);
    Маркеры.Добавить("--" + Разделитель + Символы.ПС);
    Маркеры.Добавить("--" + Разделитель + Символы.ВК);
    Маркеры.Добавить("--" + Разделитель + Символы.ВК + Символы.ПС);
    Маркеры.Добавить("--" + Разделитель + "--");
20 Сияющий в темноте
 
13.01.20
18:41
В windows,при желании,можно включить регистрозависимость файловой системы,если что.

перенос строки,обычно,не сильно важен,если правильно его читать,там илм 10 или 13 или 13 потом 10.
ну никогда не было проблем.
получил 10,значит линь
получил 13,если после нее 10 то винда иначе мак.
21 Noxvil
 
13.01.20
18:48
(19)

"Content-Type: text/plain

1
2
3
"

(20) В (14) я привёл код
22 Garykom
 
гуру
13.01.20
19:25
(21) Хочешь сказать что должно быть в одну строку 123 ?
23 Noxvil
 
13.01.20
22:07
(22) Должно быть

"1
|2
|3"
24 Garykom
 
гуру
13.01.20
22:12
(23) Покажи что происходит с файлом когда маркеры как в (19) без лишних дополнений.
Узнать что отправил и что пришло можно через hex-редактор, оно встроено в TC или Far
25 Garykom
 
гуру
13.01.20
22:12
(24)+ Total Commander
26 Garykom
 
гуру
13.01.20
22:15
И да лучше мелкий бинарный файл отправляй где коды символов по порядку увеличиваются, тогда сразу видно будет что не так.
00 01 02 03 04 05 06 07 08 09 0A 0B и т.д.
27 Noxvil
 
14.01.20
01:14
(26) Я через notepad++ открываю, удаляю перенос строк и всё ок
28 Noxvil
 
17.01.20
20:51
(26) в общем - в одном случае с сервера unix приходит


"‰PNG

  
IHDR  ,  ,   y}Žu       pHYs      ÒÝ~ü  OIDATxœíÿq9҆×ý/}HuHt˜ŽÀr+GðјŠÀR#X)‚#83‚¹‚Üciþ@c€`ð<U¬õºL‘šÞén¼hئi @‹µöÔã^ÇƘ3ùëöïZÜßõ¼hkcÌcçÿŸåeäï¿»ÿošæyÇû¡B¬"

с постмана (с домашнего пк на винде) приходит ( и подправив всего 2 пробела (переноса строк)) - файл открывается

"‰PNG

  
IHDR  ,  ,   y}Ћu       pHYs      ТЭ~ь  OIDATxњнќяq9Т†Чэ/}HЃuHЃt˜ЋАr+GрС˜ЉАR#X)‚#83‚№‚ЬcЌiю@cЂ`р<U¬хєL‘љЮйnјhШ¦i @‹µцФг^ЗƘ3щлцпZЬЯхјhkcМcзяџеeдпї»яoљжyЗыЎB¬"

Я в этом слабо понимаю, надо преобразовать файл из одной кодировки в другую?

Скорее всего UTF-8 > Ansi
29 Noxvil
 
17.01.20
20:59
если просто в notepad++ сделать, то добвляются лишние символы типо "B" и часть символов становится непохожей
30 Garykom
 
гуру
17.01.20
20:59
Content-Encoding из https://ru.wikipedia.org/wiki/Список_заголовков_HTTP

И для бинарный файлов у тебя должно быть не Content-Type: text/plain

А нечто более вменяемое image/png для PNG
Или же application/octet-stream для всего непонятного бинарного
https://developer.mozilla.org/ru/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Полный_список_типов_MIME
31 Garykom
 
гуру
17.01.20
21:00
(29) Короче у тебя глюки и на этапе отправки и на этапе получения. А с протоколом HTTP и с 1С все замечательно.
32 Noxvil
 
19.01.20
17:42
(29) Как подобные проблемы исправляются?
33 ДенисЧ
 
19.01.20
18:01
В текстовом редакторе двоичные файлы править - это посильней Фауста будет...
34 Noxvil
 
19.01.20
19:06
(33) А по теме есть чем помочь?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан