Написал я эту програмку, вот выкладываю решение моей проблемы на случай если ктото сюда попадет в своих поисках.
Вся проблема в том что данные из стандартного потока ввода читаются в текстовом режиме, некоторые байты поэтому искажаются и принимаются как управляющие. Все было бы просто если бы
нужно было читать из файла(переоткрыть файл делов то), но так как стандартный поток ввода уже открыт, его необходимо перевести в бинарный режим чтения не закрывая.
Вот функция(работает в Microsoft Visual C++ 6.0, в досовском С++ вроде такая тоже есть но без нижнего подчеркивания), которая в данном случае переводит стандартный поток ввода в бинарный режим чтения:
_setmode(_fileno(stdin),_O_BINARY); //(хочу заметить что найти нужную функцию в инете почемуто оказалось нелегко)
После того как stdin переведен в бинарный режим остается дело техники - разобрать данные POST запроса.
Вот моя програмка(скомпилировать в Microsoft Visual C++ 6.0 как консольное приложение и положить в папку cgi на веб сервере) по загрузке 4-х файлов.
// loader.cpp : Defines the entry point for the console application. #include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #include "io.h" #include "fcntl.h" #define term_size 200 #define header_size 400 int get_header(char *tmp_header) { int stop,tmp_count; char ch; for (tmp_count=0,stop=0;((stop==0)&&(tmp_count<header_size));tmp_count++) { ch=fgetc(stdin); tmp_header[tmp_count]=ch; if (tmp_count>4) { if ((tmp_header[tmp_count-1]=='\n')&&(tmp_header[tmp_count]=='\n')) { stop=1; tmp_header[tmp_count+1]=0; } if ((tmp_header[tmp_count-2]=='\n')&&(tmp_header[tmp_count-1]=='\r')&&(tmp_header[tmp_count]=='\n')) { stop=1; tmp_header[tmp_count+1]=0; } } } return 1; } int get_filename(char *tmp_header, char *filename) { int i; char *ptr; ptr=strstr(tmp_header,"filename="); for (;*ptr!='"';ptr++) { } ptr++; for (i=0;((i<29)&&(*ptr!='"'));ptr++) { if ((*ptr=='\\')||(*ptr=='/')) { i=0; } if ((*ptr!='\\')&&(*ptr!='/')&&(*ptr!='"')) { filename=*ptr; i++; } filename=0; } return 1; } int get_filebody(char *terminator,char *filename,long int toread) { int i,stop,wr; wr=0; long int readed; int term_len=strlen(terminator); char *buffer=(char *)malloc(term_len+1); buffer[0]=0; readed=0; char ch; FILE *fp; if ((strcmp(filename,""))!=0) { fp=fopen(filename,"wb"); wr=1; } for (i=0,stop=0;stop==0;) { ch=fgetc(stdin); readed++; if (terminator==ch) { buffer=ch; buffer[i+1]=0; i++; } else { if (strlen(buffer)==0) { //write ch only if (wr==1) { fputc(ch,fp); } } else { //write buffer and ch if (wr==1) { fwrite(buffer,strlen(buffer),1,fp); fputc(ch,fp); } buffer[0]=0; i=0; } } if (term_len==i+1) { stop=1; } if (readed>=toread) { if (strlen(buffer)>0) { fwrite(buffer,strlen(buffer),1,fp); } stop=1; } } if (wr==1) { fclose(fp); } return readed; } int main(int argc, char* argv[]) { printf("Content-type: text/html\n"); printf("Pragma: no-cache\n"); printf("\n"); printf("Proga: loader.<br>\n"); char *REQUEST_METHOD=getenv("REQUEST_METHOD"); char *CONTENT_LENGTH=getenv("CONTENT_LENGTH"); printf("REQUEST_METHOD: %s.<br>\n",REQUEST_METHOD); printf("CONTENT_LENGTH: %s.<br>\n",CONTENT_LENGTH); int cmp_rez=strcmp(REQUEST_METHOD,"POST"); if (cmp_rez==0) { int tmp_count,stop; char ch; char terminator[term_size]; strset(terminator,'1'); long int num_of_bytes=atoi(CONTENT_LENGTH); long int readed; // пожалуй самое главное: _setmode(_fileno(stdin),_O_BINARY); // устанавливаем стандартный поток ввода(stdin) в бинарный режим чтения! //получаем терминатор - разделитель данных в POST запросе terminator[0]='\r'; terminator[1]='\n'; for (tmp_count=2,stop=0;((stop==0)&&(tmp_count<term_size));tmp_count++) { ch=fgetc(stdin); terminator[tmp_count]=ch; if (tmp_count>5) { if (terminator[tmp_count]=='\n') { stop=1; terminator[tmp_count]=0; } } } // терминатор получен. char tmp_header[header_size]; char filename[30]=""; long int term_len=strlen(terminator); // загрузка первого файла get_header(tmp_header); // прочитать заголовок перед телом файла get_filename(tmp_header,filename); // взять из заголовка имя файла readed=get_filebody(terminator,filename,num_of_bytes); // прочитать тело файла и сохранить printf("filename:%s;<br>\n",filename); filename[0]='\0'; // загрузка второго файла get_header(tmp_header); get_filename(tmp_header,filename); num_of_bytes-=readed; readed=get_filebody(terminator,filename,num_of_bytes); printf("filename:%s;<br>\n",filename); filename[0]='\0'; // загрузка трельего файла get_header(tmp_header); get_filename(tmp_header,filename); num_of_bytes-=readed; readed=get_filebody(terminator,filename,num_of_bytes); printf("filename:%s;<br>\n",filename); filename[0]='\0'; // загрузка четвертого файла get_header(tmp_header); get_filename(tmp_header,filename); num_of_bytes-=readed; readed=get_filebody(terminator,filename,num_of_bytes); printf("filename:%s;<br>\n",filename); filename[0]='\0'; } return 1; }
PS: не совсем сохранились сдвиги в коде:(
Это для того чтобы Apache не выдавал "Internal error", вобщем в данном коде вроде больше нагрузки не несет.
Прописал feof в коде и ferror, оказалось при загрузке картинки браузер присылает только первых +-50 байтов :-0
А как же взять остальную часть картинки?
PS: ferror выдает 0.
Надо внизу страницы разместить блок(table2), так чтобы при растягивании в высоту страницы он всегда был там, кроме того случая когда какой нибудь текст выше будет смещать блок(table2) еще ниже.
Я описал эту ситацию с помощью таблицы table1, вопрос как сделать аналогично не используя table1?
Благодарю за помощь, все работает.
Посмотри на http://infostore.org/
вот только там какието сложности если вы не из Украины.
Спасибо всем за ссылки. Но вот появилась другая мысль домены в зоне .com.ua получаются дороже чем в зоне .com, хотя ИМХО домен второго уровня лучше чем третьего.
В чем тут дело у домена в зоне .com.ua есть какие то приимущества?🙄
А мне не нравится шапка цвет фона синий цвет шрифта тусклый, а когда наводиш на ссылку фон становится черным а ссылка белой не приятно читать. А в остальном дизайн более менее.
На мой взгляд это одна большая головная боль: вычисльть несколько тысяч контрольных сум и сопоставлять числами для формирования базы. А если картинку Яндекса вдруг решат немного изменить, то что начинать делать базу сначала?☝
Надо в IE меню сервис вкладка конфиденциальность уровень защиты понизить или если стоит фаервол, то он может блокировать там надо настройки поменять.
Отписал в личку.