Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
Обработка multipart данных |

15.09.2007, 10:08
|
|
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме: 4172659
Репутация:
646
|
|
Обработка multipart данных
Позарез требуется реализация обработки 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/*, то содержимое рассматривается как текст, иначе - как бинарные данные. Нужно все файлы сохранить под своими именами. У кого есть алгоритм, поделитесь, а то я застрял на этих бинарных данных.
|
|
|

17.09.2007, 17:41
|
|
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме: 4608122
Репутация:
874
|
|
Взялся за реализацию.... хотелось бы уточнить откуда берем данные? Я создал файл с содержимым как описано в примере и работаю с файлом. Пробую реализовать поиск разделителя и имени в файле, а после сохранить нужные данные в заданом формате.
Если открывать файл мультипарт данных как текстовый то легко найти нужный разделитель но не понятно как прочитать бинарные данные, если файл открываем как набор байт, то легко сохранить данные, но неудобно реализовать поиск разделителя имени и т.д. (но возможно). Была попытка открыть файл как текст найти нужное, сохранить позицию с которой нужно записывать данные, открыть файл уже как бинарник и сохранять с нужной позиции.... тут я остановился и решил уточнить откуда берем данные.
З.Ы. А может вообще нужно иначе, короче хочу попробовать сделать, нужна дополнительная инфа...
|
|
|

17.09.2007, 18:06
|
|
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме: 4172659
Репутация:
646
|
|
Данные берутся из стандартного устройства ввода. С этим я уже криво, но разобрался, иду дальше =)
|
|
|

17.09.2007, 18:24
|
|
Постоянный
Регистрация: 03.02.2007
Сообщений: 520
Провел на форуме: 1777536
Репутация:
932
|
|
Есть маленькая поправочка: Перед началом перечисления данных файла я бы поставил "Start".
Если тип данных text/*, то содержимое рассматривается как текст, иначе - как бинарные данные.
А разница? Просто в файл пиши и всё.
А так грубо накидал.(Вместе со старотом)
Код:
#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++;
}
}
|
|
|

20.09.2007, 00:38
|
|
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме: 4608122
Репутация:
874
|
|
Вот попытка решить задачку.
Делал как я уже писал через файл. Т.е. данные брал из файла и делил так как нужно.
Вот ссылки на решение
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 если алгоритм подходит, то могу перевести на Дельфи. И сразу рекомендации по улучшению. Лучше данные сначала засунуть в память, а потом работать уже с памятью, но как я уже писал - опыт еще не позволяет такие фишки вытворять...
Надеюсь помог (если сильно плохо, то показал как НЕ надо делать  )
Последний раз редактировалось Red_Red1; 20.09.2007 в 00:46..
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|