Обработка multipart данных

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Joker-jar, 15 Sep 2007.

  1. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Позарез требуется реализация обработки multipart данных на Delphi или C++.

    Пример данных:

    ------------zqaJEx7bclBmbt00xtw1Cp
    Content-Disposition: form-data; name="textfile"; filename="1.bmp"
    Content-Type: image/bmp

    binary-data
    ------------zqaJEx7bclBmbt00xtw1Cp
    Content-Disposition: form-data; name="binfile"; filename="Превед.txt"
    Content-Type: text/plain

    Hello, world
    ------------zqaJEx7bclBmbt00xtw1Cp--


    У меня есть boundary - разделитель блоков данных (в данном случае ----------zqaJEx7bclBmbt00xtw1Cp). '--'+boundary означает конец блока, '--'+boundary+'--' - конец данных. Первая строка блока содержит имя файла (filename), вторая - тип данных. Далее идет пустая строка и содержимое файла. Если тип данных text/*, то содержимое рассматривается как текст, иначе - как бинарные данные. Нужно все файлы сохранить под своими именами. У кого есть алгоритм, поделитесь, а то я застрял на этих бинарных данных.
     
  2. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Взялся за реализацию.... хотелось бы уточнить откуда берем данные? Я создал файл с содержимым как описано в примере и работаю с файлом. Пробую реализовать поиск разделителя и имени в файле, а после сохранить нужные данные в заданом формате.
    Если открывать файл мультипарт данных как текстовый то легко найти нужный разделитель но не понятно как прочитать бинарные данные, если файл открываем как набор байт, то легко сохранить данные, но неудобно реализовать поиск разделителя имени и т.д. (но возможно). Была попытка открыть файл как текст найти нужное, сохранить позицию с которой нужно записывать данные, открыть файл уже как бинарник и сохранять с нужной позиции.... тут я остановился и решил уточнить откуда берем данные.
    З.Ы. А может вообще нужно иначе, короче хочу попробовать сделать, нужна дополнительная инфа...
     
  3. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Данные берутся из стандартного устройства ввода. С этим я уже криво, но разобрался, иду дальше =)
     
  4. Ky3bMu4

    Ky3bMu4 Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    Есть маленькая поправочка: Перед началом перечисления данных файла я бы поставил "Start".

    А разница? Просто в файл пиши и всё.
    А так грубо накидал.(Вместе со старотом)
    Code:
    #include "windows.h"
    
    void main (void){
    char buff[10000];//буффер с твоими данными
    char temp[1000];//буффер для данных 
    char name[10];//буффер для имени
    int x,z,c,u;//инты для буфферов)))
    bool y; //флаг
    x=0;
    u=0;
    c=0;
    
    while(x<=10000){ // ищем 1 (------------zqaJEx7bclBmbt00xtw1Cp) 
    	if(buff[x]=='1'){
    		
    		if(buff[x+1]=='C'){
    			
    			if(buff[x+2]=='p'){ //нашли разделитель
    				while(buff[x]!='f'){ //ищем file
    					if(buff[x+1]=='i'){
    						if(buff[x+2]=='l'){
    z=x+10;
    while(buff[z]!='"'){
    	name[c]=buff[z];
    	z++;
    	c++;
    }
    name[c]=NULL;//т.к. последний символ "
    
    //тут нужно создать файл с именем name
    
    
    						}
    					}
    					x++;
    
    				}
    				while(buff[z]!='a'){//ищем Start
    					if(buff[z+1]=='r'){
    						if(buff[z+2]=='t'){
    							z=z+3;
    							y=FALSE;
    							while(y!=TRUE){
    								while(buff[z]!='-'){
    									temp[u]=buff[z];
    									z++;
    									u++;
    								}
    								if(buff[z+1]=='-'){
    									if(buff[z+2]=='-'){ //ну я думаю в тексте файла кроме разделителя 3 - подряд небудет
                                         y=TRUE;
    									}
    								}
    							}
    							//а тут нужно записать temp в файл с именем name
    						}
    					}
    				}
    
    			}
    		}
    	}
    	x++;
    
    }
    
    
    }
    
     
  5. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Вот попытка решить задачку.
    Делал как я уже писал через файл. Т.е. данные брал из файла и делил так как нужно.
    Вот ссылки на решение
    http://forfiles2007.narod.ru/MULTDAT1.PAS исходник
    http://forfiles2007.narod.ru/TEST.111 файл который разбирал, ну это чтобы если пробовать то свой не делать :)
    http://forfiles2007.narod.ru/MULTDAT1.EXE может кому просто интересно увидеть результат :)
    http://forfiles2007.narod.ru/JokerJar.rar все это дело в архиве.
    Сразу скажу нужна доработка для боевых условий. Писал на Турбо Паскаль 7,0. Можно быстро перевести в Дельфи. Писал для того чтобы решить задачку.
    Да вспомнил, поступил так как рекомендовал Ky3bMu4, перед началом перечисления данных файла я поставил "start" Это придает некоторое удобство для написания, хотя можно и без него, но кривее и косее :) т.к. пока опыт еще не тот.
    Joker-jar если алгоритм подходит, то могу перевести на Дельфи. И сразу рекомендации по улучшению. Лучше данные сначала засунуть в память, а потом работать уже с памятью, но как я уже писал - опыт еще не позволяет такие фишки вытворять...
    Надеюсь помог (если сильно плохо, то показал как НЕ надо делать ;) )
     
    #5 Red_Red1, 20 Sep 2007
    Last edited: 20 Sep 2007