Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как загрузить изображение на сервер? посылка jpeg формой как его получить 
:(
    Опции темы
Voronin_Igor
Дата 7.11.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 14.7.2008
Где: Петрозаводск

Репутация: нет
Всего: нет



Здравствуйте, подскажите пожалуйста! Мне нужно отправить изображение html формой, cgi скрипту и чтобы он сохранил его на сервере. Вот код :
Код

HTML форма

      <h2><p><b> Форма для загрузки файлов </b></p></h2>
      <form action="http://localhost/cgi-bin/1.cgi" method="post" enctype="multipart/form-data">
      <input type="file" name="file"><br> 
      <input type="submit" value="Загрузить"><br>
      </form>


Код

 #include <fstream>
#include <iostream>
#include <jpeglib.h>
#include<string>
#include <stdlib.h>
using namespace std;

int main ()
 {
 int ln; char *str;
ln=atoi(getenv("CONTENT_LENGTH"));
str=new char[ln];
cin.read(str,ln);
ofstream fout("img.jpg");
fout<<str;
  fout.close();
.....

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


PM MAIL   Вверх
Alca
Дата 8.11.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Код

int main () {
    int ln;  
    unsigned char *str;

    str=new unsigned char[ln];
    ..
}



Добавлено через 48 секунд
+ fwrite


--------------------
PM WWW ICQ Skype Jabber   Вверх
Voronin_Igor
Дата 9.11.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 14.7.2008
Где: Петрозаводск

Репутация: нет
Всего: нет



В общем файл я принял только он ввиде кучи символов экрана на три, в приципе ничего удивительного, только как его обратно в картинку превратить?  да и незакодированный ли он?  Ну как то же люди делают подобные программы! 
любые попытки дать ему разрешение .jpg заканчиваются тем то появляется файл но он пустой  smile  внутри вот код:
Код

int main ()
 {
 int ln;
char *vchrgBuf;
ln=atoi(getenv("CONTENT_LENGTH"));
vchrgBuf=new char[ln];
cin.read(vchrgBuf,ln);
ofstream fout("img.jpg");
fout<<vchrgBuf;             // здесь в файл не сохраняюся символы
fout.close();
cout<<"Content-type: text/html\n\n";
cout.write(vchrgBuf,ln); // вот здесь от выводит в браузер кучу символов
 return 0;
 }
 

как сделать чтобы это все заработало ? HELP! 
PM MAIL   Вверх
Alca
Дата 10.11.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Цитата

 общем файл я принял только он ввиде кучи символов

Покажи начало файла


--------------------
PM WWW ICQ Skype Jabber   Вверх
Voronin_Igor
Дата 11.11.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 14.7.2008
Где: Петрозаводск

Репутация: нет
Всего: нет



Цитата(Alca @  10.11.2009,  19:53 Найти цитируемый пост)
Покажи начало файла


Код

-----------------------------174534309114225223161877830702 
Content-Disposition: form-data; name="file"; filename="korz.jpg" Content-Type: image/jpeg ЪьЪЮ�JFIF��H�H��ЪА
бExif��MM�*������������������b�������j(�������1�������r2�������█┤i����
���╓���п���H������H���Adobe Photoshop CS Windows�2008:11:18 23:48:30�����═�������═�������м═����
���┤���������



Это сообщение отредактировал(а) Voronin_Igor - 11.11.2009, 11:15
PM MAIL   Вверх
DrHex
Дата 12.11.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



читать спецификацию CGI сценария. Теперь отвас требуется сохранить файл, а не "пакет"(а точнее context) cgi сценария......


Цитата

Content-Disposition: form-data; name="file"; filename="korz.jpg" Content-Type: image/jpeg

Это для кого???
--------------------
google.com и это все.
PM MAIL   Вверх
Alca
Дата 12.11.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Тебе надо вырезать содержимое файла (JFIF, т.е. JPEG) и сохранить на диск


--------------------
PM WWW ICQ Skype Jabber   Вверх
Voronin_Igor
Дата 12.11.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 14.7.2008
Где: Петрозаводск

Репутация: нет
Всего: нет



Цитата(DrHex @  12.11.2009,  12:17 Найти цитируемый пост)

Это для кого??? 

Незнаю для кого но это приходит вместе с изображением(точнее символами) мне тут подсказали что это все MIME кто нибудь знает как с этим работать или библиотеку. вырезать пробовал  пока ничего не получается 
PM MAIL   Вверх
Alca
Дата 12.11.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Цитата

вырезать пробовал

Покаж


--------------------
PM WWW ICQ Skype Jabber   Вверх
krypt3r
Дата 13.11.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: нет
Всего: 16



Рабочий код на С, работающий под линуксом. Бинарный файл отправляется в Base64-формате. Ваш CGI-скрипт должен уметь такие файлы обрабатывать
Код

#include <stdio.h>                 
#include <string.h>                
#include <stdlib.h>                
#include <time.h>                  
#include <sys/types.h>             
#include <sys/stat.h>              
#include <unistd.h>                
#include <netinet/in.h>            
#include <sys/socket.h>            
#include <rpm/base64.h>            

#define URL "/cgi-bin/uploader.pl"
#define HOST "127.0.0.1"          
#define PORT 80                   
#define REFERER "http://127.0.0.1/"
#define UPLOAD_DIR "/var/www/html/images/"
#define FILE_NAME "deepsky.gif"                        

char* generate_boundary () {
  int count = 8, i = 0;     
  char chars[] = "1234567890qazwsxedcrfvtgbyhnujmikolpQAZWSXEDCRFVTGBYHNUJMIKOLP";
  char *res;                                                                      
  int rnd;                                                                        
  int len = strlen (chars);                                                       
                                                                                  
  if ((res = calloc (count, sizeof (char *))) == NULL) {                          
    return NULL;                                                                  
  }                                                                               
  srand (time (NULL));                                                            
  for (; i < count; i++) {                                                        
    rnd = 0 + (int) ((len - 1) * (rand () / (RAND_MAX + 1.0)));                   
    res[i] = chars[rnd];                                                          
  }                                                                               
  return res;                                                                     
}                                                                                 

char *get_file_content (char *filename, int filesize) {
  FILE *f;                                             
  char *file_content, *file_content_base64;            
                                                       
  if ((file_content = calloc (filesize, sizeof (char *))) == NULL) {
    printf ("calloc() error\n");                                    
    return NULL;                                                    
  }                                                                 
  if ((f = fopen (filename, "r")) == NULL) {                        
    printf ("fopen() error\n");                                     
    return NULL;                                                    
  }                                                                 
  if (fread (file_content, 1, filesize, f) < filesize) {            
    printf ("fopen() error\n");                                     
    return NULL;                                                    
  }                                                                 
  fclose (f);                                                       
  //apr_base64_encode (file_content_base64, file_content, filesize);
  return b64encode (file_content, filesize, 76);                    
}                                                                   

int send_post (char *request) {
  int s;                       
  struct sockaddr_in sin;      
  int sended, recved;          
  char buf[1024];              
                               
  if ((s = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
    //printf ("socket() error\n");                           
    return -1;                                               
  }                                                          
  memset (&sin, '\0', sizeof (struct sockaddr_in));          
  sin.sin_family = PF_INET;                                  
  sin.sin_port = htons (PORT);                               
  sin.sin_addr.s_addr = inet_addr (HOST);                    
  /*if (bind (s, (struct sockaddr *) &sin, sizeof (struct sockaddr_in)) < 0) {
    return -2;                                                                
  }*/                                                                         
  if (connect (s, (struct sockaddr *) &sin, sizeof (struct sockaddr_in)) < 0) {
    return -3;                                                                 
  }                                                                            
  //printf ("Connected\n");                                                    
  if ((sended = sendto (s, request, strlen (request), 0, (struct sockaddr *) &sin,
    sizeof (struct sockaddr_in))) < 0) {                                          
      return -4;                                                                  
  }                                                                               
  printf ("Sended %d bytes\n", sended);                                           
  /*memset (buf, '\0', sizeof (buf));                                             
  recved = recvfrom (s, buf, sizeof (buf), 0, (struct sockaddr *) &sin,           
    sizeof (struct sockaddr_in));                                                 
  printf ("Received %d bytes\n%s\n", recved, buf);*/                              
  close (s);                                                                      
  return 0;                                                                       
}                                                                                 

int main (int argc, char **argv) {
  char request[] = "POST %s HTTP/1.1\r\n"
                   "Connection: close\r\n"
                   "Host: %s\r\n"         
                   "Referer: %s\r\n"      
                   "User-Agent: Opera\r\n"
                   "Content-Length: %d\r\n"
                   "Content-Type: multipart/form-data; boundary=%s\r\n"
                   "\r\n";                                             
  char req[] = "--%s\r\n"                                              
               "Content-Disposition: form-data; name=\"updir\"\r\n"    
               "\r\n"                                                  
               "%s\r\n"                                                
               "--%s\r\n"                                              
               "Content-Type: image/gif; name=\"%s\"\r\n"              
               "Content-Disposition: form-data; name=\"fname\"; filename=\"%s\"\r\n"
               "Content-Transfer-Encoding: base64\r\n"                              
               "\r\n"                                                               
               "%s\r\n"                                                             
               "--%s--\r\n\r\n\0";                                                  
  char *boundary, post[1024 * 10], post2[1024 * 10], *file;                         
  struct stat st;                                                                   
                                                                                    
  if ((boundary = generate_boundary ()) == NULL) {                                  
    printf ("calloc() error\n");                                                    
    return EXIT_FAILURE;                                                            
  }                                                                                 
                                                                                    
  if (stat (FILE_NAME, &st) < 0) {                                                  
    printf ("stat() error\n");                                                      
    return EXIT_FAILURE;                                                            
  }                                                                                 
                                                                                    
  if ((file = get_file_content (FILE_NAME, st.st_size)) == NULL) {                  
    return EXIT_FAILURE;                                                            
  }                                                                                 
  //printf ("%s\n", file);return;                                                   

  sprintf (post2, req, boundary, UPLOAD_DIR, boundary, FILE_NAME, FILE_NAME,
    file, boundary);
  sprintf (post, request, URL, HOST, REFERER, sizeof (post2), boundary);
  strncat (post, post2, sizeof (post2));
  printf ("%s\n", post);

  int ret = send_post (post);
  switch (ret) {
    case -1 :
      printf ("socket() error\n");
      return EXIT_FAILURE;
      break;
    /*case -2 :
      printf ("bind() error\n");
      return EXIT_FAILURE;
      break;*/
    case -3 :
      printf ("connect() error\n");
      return EXIT_FAILURE;
      break;
    case -4 :
      printf ("sendto() error\n");
      return EXIT_FAILURE;
      break;
    default :
      break;
  }
  return EXIT_SUCCESS;
}

Если будут вопросы по коду, пишите в ПМ
PM MAIL   Вверх
Voronin_Igor
Дата 14.11.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 14.7.2008
Где: Петрозаводск

Репутация: нет
Всего: нет



Всем спасибо разобрался Alca ты был прав нужно было вырезать код и просто сохранить сейчас у меня код корявый когда приведу его к нормальному виду обязательно выложу smile 
PM MAIL   Вверх
Voronin_Igor
Дата 15.11.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 14.7.2008
Где: Петрозаводск

Репутация: нет
Всего: нет



как обещал 
PS
 у меня mandriva Linux
Код

int main ()
 {
 int ln,i=0,n=0,x=0,k=0 ;
string str2; 
ln=atoi(getenv("CONTENT_LENGTH"));//Вычисление длины передаваемых данных
 //Выделяется динамическая память для хранения формы
char *vchrgBuf;
vchrgBuf=new char[ln];
str2="Content-Type: image/jpeg";
cin.read(vchrgBuf,ln); //Cчитывам из стандартного потока все данные
cout<<"Content-type: text/html\n\n";
//обрезаем конец файла
i=ln;
while(i>0)
{
 if(vchrgBuf[i]=='\n')
 {
  k++;
   if(k==2)
   {
    ln=i-1;
    break;
   }
 }
i--;
}
i=0;
//обрезаем начало файла и проверяем формат если нет то вывести строку об ошибке
while(i!=ln)
{
  if(vchrgBuf[i]==str2[n+1])
  {
    while(vchrgBuf[i+n]==str2[n+1])
     {
      n++;
     }
    if(n!=23)
    {
     n=0;
    }else
     {
     n+=i;
     n+=4;
      char *vchrgBuf1;
      vchrgBuf1=new char[ln-n];
      while(n!=ln)
      {
       vchrgBuf1[x]=vchrgBuf[n];
       n++;
       x++;
      }
       ofstream fout("imeg1.jpg");
       fout.write(vchrgBuf1,ln);
       cout<<"Изображение заружено.";
       break; 
     }
  }
i++;
}
if(n==0)
cout<<"Сбой при загрузке изображения";
return 0;
 }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.