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

Статус
В этой теме нельзя размещать новые ответы.

antidote

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

Не так давно тоже нужно было отправить файл на сервер (фотки). Сначала делал соектами, но слишком геморно - куки самому сохранять и т.д. В итоге остановился на 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++
 
Код это прекрасно. Это передача файла в POST по определенному урлу?

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

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

Книжка А. Подгорецкий. Indy in Depth Глубины Indy. 128 стр. (pdf)
 
Код это прекрасно. Это передача файла в POST по определенному урлу?
И раз уж понеслась, то каким методом можно защититься от подмены передающей программы, чтоб только мое приложение смогло передавать файлы.
На данный момент добше скорее всего интересует теория.
Книжка А. Подгорецкий. Indy in Depth Глубины Indy. 128 стр. (pdf)

да-да, вот эта книжка. Да, тут передается файл на сайт (форма заливки фоток на одном портале).

Я защитил так: взял функцию от времени, не имеющую обратную. На сервере вычеслял такое же значение и сравнивал данные. Без дебагера вряд ли получится узнать, что за функция используется. Только нужно учесть время, за которое пакеты доходят до сервера, например, поставить минимальный отрезок для значение функции в несколько минут.
 
Код:
DataIn->WriteString("Content-Type: image/jpeg\r\n\r\n");
DataIn->CopyFrom(PictureStream,PictureStream->Size);
А что за класс у DataIn? Судя по первой строке это TStringStream, а по второй так TFileStream. Я с TStream еще не встречался. Потому тут заминка получилась.
А по поводу защиты, то Вы поступали так:
1. Брали текущее время с точностью до нескольких минут.
2. Проводили некую операцию (хеш?) на полученой меткой времени и отправляли ее в запросе
3. До/во время/после загрузки файла на сервер там происходило опять-таки вычисление времени с некоторойй точностью.
4. Сравнивались два результата?
Может есть какое-то шифрование которое легко реализуется на стороне Builder и на стороне PHP? Попробовал работать с mcrypt Rijndael, но шифрование одинаковых строк с одинаковыми ключами на сервере и в приложении дают разные результаты :-] Вероятнее всего, что я не до конца понял пути генерации ключей в Для просмотра ссылки Войди или Зарегистрируйся и Для просмотра ссылки Войди или Зарегистрируйся. Пока что отложил этот вопрос.

UPD: Разобрался, образец кода шикарный
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху