C++ Builder и аплоад файлов на WEB сервер

Тема в разделе "Другие языки", создана пользователем antidote, 3 ноя 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Пришло время заняться следующим вопросом. Есть некое приложение, которое должно отправлять на WEB сервер файл и получать в ответ ссылку на файл. Интересуют возможные реализации такой схемы. Т.к. я не уверен что я себе представляю лучший вариант воплощения. Файлы будут небольшие, скажем до 2-3 Мб, но в большом количестве. Что можете посоветовать почитать?
     
  2. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    Не так давно тоже нужно было отправить файл на сервер (фотки). Сначала делал соектами, но слишком геморно - куки самому сохранять и т.д. В итоге остановился на Indy HTTP. Где-то валялась книга в pdf по Indy, сейчас не могу найти, но в гуге есть инфа по этому компоненту. Вот тебе кусок кода из моей программы:

    Код:
    	//=================отправка фотографии
    	if (Form4->Edit11->Text!="") {
    		temp=Form4->Edit11->Text;
    		while (temp.Pos("\\")!=0)
    		{
    			temp = temp.SubString(temp.Pos("\\")+1,temp.Length()-temp.Pos("\\")+1);
    		}
    		PictureStream->LoadFromFile(Form4->Edit11->Text);
    		DataIn->Seek(0,soFromBeginning);
    		Form1->IdHTTP1->Request->ContentType="multipart/form-data; boundary=---------------------------267462439010424";
    		DataIn->WriteString("-----------------------------267462439010424\r\n");
    		DataIn->WriteString("Content-Disposition: form-data; name=\"image\"; filename=\""+temp+"\"\r\n");
    		DataIn->WriteString("Content-Type: image/jpeg\r\n\r\n");
    		DataIn->CopyFrom(PictureStream,PictureStream->Size);
    		DataIn->WriteString("\r\n-----------------------------267462439010424\r\n");
    		DataIn->WriteString("Content-Disposition: form-data; name=\"imgnum\"\r\n\r\n");
    		DataIn->WriteString("0\r\n");
    		DataIn->WriteString("-----------------------------267462439010424\r\n");
    		DataIn->WriteString("Content-Disposition: form-data; name=\"obj_id\"\r\n\r\n");
    		DataIn->WriteString("0\r\n");
    		DataIn->WriteString("-----------------------------267462439010424--\r\n\r\n");
    
    		//DataIn->WriteString(post4.c_str());
    		DataOut->Seek(0,soFromBeginning);
    		Form1->IdHTTP1->Post(url_pic,DataIn,DataOut);
    
    		re_str = "imgdiv.tag = '(.*?)';";
    		if (regcomp(&re,re_str,0));
    			//ошибка компиляции регулярного выражения
    		if (regexec(&re, DataOut->DataString.t_str(), RE_MATCHES_MAX, re_matches, 0));
    			//ошибка в поиске
    		else
    		{
    			md5s=DataOut->DataString.SubString(re_matches[1].rm_so+1,re_matches[1].rm_eo-re_matches[1].rm_so);
    		}
    	}
    PS: если так не подойдет (уж очень много проблем с Indy у меня было, не одну ночь помучался), то попробуй Curl для C++
     
    antidote нравится это.
  3. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    Код это прекрасно. Это передача файла в POST по определенному урлу?

    И раз уж понеслась, то каким методом можно защититься от подмены передающей программы, чтоб только мое приложение смогло передавать файлы.

    На данный момент добше скорее всего интересует теория.

    Книжка А. Подгорецкий. Indy in Depth Глубины Indy. 128 стр. (pdf)
    http://narod.ru/disk/10191921000/Indy%20in%20Depth%20Glybinu%20Indy.rar.html
     
  4. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    да-да, вот эта книжка. Да, тут передается файл на сайт (форма заливки фоток на одном портале).

    Я защитил так: взял функцию от времени, не имеющую обратную. На сервере вычеслял такое же значение и сравнивал данные. Без дебагера вряд ли получится узнать, что за функция используется. Только нужно учесть время, за которое пакеты доходят до сервера, например, поставить минимальный отрезок для значение функции в несколько минут.
     
  5. antidote

    antidote

    Регистр.:
    21 янв 2008
    Сообщения:
    167
    Симпатии:
    42
    А что за класс у DataIn? Судя по первой строке это TStringStream, а по второй так TFileStream. Я с TStream еще не встречался. Потому тут заминка получилась.
    А по поводу защиты, то Вы поступали так:
    1. Брали текущее время с точностью до нескольких минут.
    2. Проводили некую операцию (хеш?) на полученой меткой времени и отправляли ее в запросе
    3. До/во время/после загрузки файла на сервер там происходило опять-таки вычисление времени с некоторойй точностью.
    4. Сравнивались два результата?
    Может есть какое-то шифрование которое легко реализуется на стороне Builder и на стороне PHP? Попробовал работать с mcrypt Rijndael, но шифрование одинаковых строк с одинаковыми ключами на сервере и в приложении дают разные результаты :-] Вероятнее всего, что я не до конца понял пути генерации ключей в PHP и С Builder. Пока что отложил этот вопрос.

    UPD: Разобрался, образец кода шикарный
     
Статус темы:
Закрыта.