Как залить файлы с клиента на сервер по HTTP
От: morok Россия  
Дата: 16.12.04 07:56
Оценка:
Здраствуйте.
Заранее говорю, что поиск по сайту не дал вразумительных ответов, поэтому и было решено задать вопрос.

А вопрос вот какой:

Я разрабатываю интернет приложение — которое является по-сути форумом со своей спецификой. И необходимо реализовать передачу файлов. То есть, чтобы клиент мог прикрепить к сообщению файл, который сохранился бы на сервере, и в дальнейшем мог бы быть просмотрен другими клиентами. Как реализовать данный механизм? Приложение реализуется на CGI ANSI C++. Таким образом использовать специфичные расширения Microsoft языка C++ нельзя. Все придется реализовывать ручками. .
Подскажите, пожалуйста хотя бы алгоритм действий или ресурс, где это можно посмотреть или прочитать об этом.
Заранее спасибо..
Лень — это не врожденное чувство советского человека, а средство борьбы с неуемной, но бестолковой энергией начальника...
Re: Как залить файлы с клиента на сервер по HTTP
От: Аноним  
Дата: 16.12.04 09:36
Оценка:
Доступ к файлу upload которго произошел

void File()
{
cgiFilePtr file;
char name[1024];
char contentType[1024];
char buffer[1024];
int size;
int got;
if (cgiFormFileName("file", name, sizeof(name)) !=
cgiFormSuccess)
{
printf("<p>No file was uploaded.<p>\n");
return;
}
fprintf(cgiOut, "The filename submitted was: ");
cgiHtmlEscape(name);
fprintf(cgiOut, "<p>\n");
cgiFormFileSize("file", &size);
fprintf(cgiOut, "The file size was: %d bytes<p>\n", size);
cgiFormFileContentType("file", contentType, sizeof(contentType));
fprintf(cgiOut, "The alleged content type of the file was: ");
cgiHtmlEscape(contentType);
fprintf(cgiOut, "<p>\n");
fprintf(cgiOut, "The file's contents are shown here:<p>\n");
if (cgiFormFileOpen("file", &file) != cgiFormSuccess) {
fprintf(cgiOut, "Could not open the file.<p>\n");
return;
}
fprintf(cgiOut, "<pre>\n");
while (cgiFormFileRead(file, buffer, sizeof(buffer), &got) ==
cgiFormSuccess)
{
cgiHtmlEscapeData(buffer, got);
}
fprintf(cgiOut, "</pre>\n");
cgiFormFileClose(file);
}


M>Я разрабатываю интернет приложение — которое является по-сути форумом со своей спецификой. И необходимо реализовать передачу файлов. То есть, чтобы клиент мог прикрепить к сообщению файл, который сохранился бы на сервере, и в дальнейшем мог бы быть просмотрен другими клиентами. Как реализовать данный механизм? Приложение реализуется на CGI ANSI C++. Таким образом использовать специфичные расширения Microsoft языка C++ нельзя. Все придется реализовывать ручками. .

M>Подскажите, пожалуйста хотя бы алгоритм действий или ресурс, где это можно посмотреть или прочитать об этом.
M>Заранее спасибо..
Re[2]: Как залить файлы с клиента на сервер по HTTP
От: ПЛОХОЙ  
Дата: 16.12.04 09:37
Оценка:
забыл залогиниться
это я был
Re[2]: Как залить файлы с клиента на сервер по HTTP
От: morok Россия  
Дата: 16.12.04 10:05
Оценка:
Здравствуйте, Плохой.

Прошу прощения за возможную тупость, Но так как я не слишком опытный, то не могли бы вы пояснить мне нкоторые моменты. А именно верно ли я понял?


//?Получение имени файла из запроса HTTP
 if (cgiFormFileName("file", name, sizeof(name)) != 
    cgiFormSuccess) 
{
   printf("<p>No file was uploaded.<p>\n");
   return;
} 
//?Получение размера файла
       cgiFormFileSize("file", &size);
//?Тип файла
        cgiFormFileContentType("file", contentType, sizeof(contentType));
//?Вывод сожержимого файла в брузер
  fprintf(cgiOut, "The file's contents are shown here:<p>\n");
  if (cgiFormFileOpen("file", &file) != cgiFormSuccess) {
    fprintf(cgiOut, "Could not open the file.<p>\n");
    return;
  }
  fprintf(cgiOut, "<pre>\n");
  while (cgiFormFileRead(file, buffer, sizeof(buffer), &got) ==
    cgiFormSuccess)
  {
    cgiHtmlEscapeData(buffer, got);
  }
  fprintf(cgiOut, "</pre>\n");
  cgiFormFileClose(file);


А как происходит сам Upload?
То есть нажимает клиент submit и...

Буду очень-очень-очень признателен.
Лень — это не врожденное чувство советского человека, а средство борьбы с неуемной, но бестолковой энергией начальника...
Re[3]: Как залить файлы с клиента на сервер по HTTP
От: ПЛОХОЙ  
Дата: 16.12.04 11:43
Оценка:
ifdef WIN32
#define SAVED_ENVIRONMENT "c:\\cgicsave.env"
#else
#define SAVED_ENVIRONMENT "/tmp/cgicsave.env"
#endif /* WIN32 */

#include <stdio.h>
#include "cgic.h"
#include <string.h>
#include <stdlib.h>

void HandleSubmit();
void ShowForm();
void Name();
void File();

int cgiMain() {
/* Send the content type, letting the browser know this is HTML */
cgiHeaderContentType("text/html");
/* Top of the page */
fprintf(cgiOut, "<HTML><HEAD>\n");
fprintf(cgiOut, "<TITLE>cgic test</TITLE></HEAD>\n");
fprintf(cgiOut, "<BODY><H1>cgic test</H1>\n");
/* If a submit button has already been clicked, act on the
submission of the form. */
if ((cgiFormSubmitClicked("testcgic") == cgiFormSuccess)
{
HandleSubmit();
fprintf(cgiOut, "<hr>\n");
}
/* Now show the form */
ShowForm();
/* Finish up the page */
fprintf(cgiOut, "</BODY></HTML>\n");
return 0;
}

void HandleSubmit()
{
File();
}

void File()
{
cgiFilePtr file;
char name[1024];
char contentType[1024];
char buffer[1024];
int size;
int got;
if (cgiFormFileName("file", name, sizeof(name)) !=
cgiFormSuccess)
{
printf("<p>No file was uploaded.<p>\n");
return;
}
fprintf(cgiOut, "The filename submitted was: ");
cgiHtmlEscape(name);
fprintf(cgiOut, "<p>\n");
cgiFormFileSize("file", &size);
fprintf(cgiOut, "The file size was: %d bytes<p>\n", size);
cgiFormFileContentType("file", contentType, sizeof(contentType));
fprintf(cgiOut, "The alleged content type of the file was: ");
cgiHtmlEscape(contentType);
fprintf(cgiOut, "<p>\n");
fprintf(cgiOut, "The file's contents are shown here:<p>\n");
if (cgiFormFileOpen("file", &file) != cgiFormSuccess) {
fprintf(cgiOut, "Could not open the file.<p>\n");
return;
}
fprintf(cgiOut, "<pre>\n");
while (cgiFormFileRead(file, buffer, sizeof(buffer), &got) ==
cgiFormSuccess)
{
cgiHtmlEscapeData(buffer, got);
}
fprintf(cgiOut, "</pre>\n");
cgiFormFileClose(file);
}

void Name() {
char name[81];
cgiFormStringNoNewlines("name", name, 81);
fprintf(cgiOut, "Name: ");
cgiHtmlEscape(name);
fprintf(cgiOut, "<BR>\n");
}

void ShowForm()
{
fprintf(cgiOut, "<form method=\"POST\" "
"enctype=\"multipart/form-data\" ");
fprintf(cgiOut, " action=\"");
cgiValueEscape(cgiScriptName);
fprintf(cgiOut, "\">\n");
fprintf(cgiOut, "<p>\n");
fprintf(cgiOut, "Text\n");
fprintf(cgiOut, "<p>\n");
fprintf(cgiOut, "<input type=\"text\" name=\"name\">Your Name\n");
fprintf(cgiOut, "<p>\n");
fprintf(cgiOut, "<p>File Upload:\n");
fprintf(cgiOut, "<input type=\"file\" name=\"file\" "
"value=\"\"> (Select A Local File)\n");
fprintf(cgiOut, "<p>\n");
fprintf(cgiOut, "<input type=\"submit\" "
"name=\"testcgic\" value=\"Submit Request\">\n");
fprintf(cgiOut, "<input type=\"reset\" "
"value=\"Reset Request\">\n");
fprintf(cgiOut, "</form>\n");
}
Re[3]: Как залить файлы с клиента на сервер по HTTP
От: glyph  
Дата: 16.12.04 11:48
Оценка:
Здравствуйте, morok, Вы писали:

M>Здравствуйте, Плохой.


M>Прошу прощения за возможную тупость, Но так как я не слишком опытный, то не могли бы вы пояснить мне нкоторые моменты. А именно верно ли я понял?


M>А как происходит сам Upload?

M>То есть нажимает клиент submit и...

M>Буду очень-очень-очень признателен.

Толкиен врет все. Я сам видел.
Во-первых, страничка с формой для аплоада должна быть примерно такой:
    <form action="upload_handler.php" method="post" enctype="multipart\form-data">
        <input name = "file_uploader" type = "file">
    </form>

Затем, в обработчике upload_handler.php нужно воспользоваться ф-цией move_uploaded_file. Т.е. man $_FILES, man move_uploaded_file.
Re[4]: Как залить файлы с клиента на сервер по HTTP
От: Vamp Россия  
Дата: 16.12.04 14:42
Оценка:
А причем тут PHP?
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Как залить файлы с клиента на сервер по HTTP
От: morok Россия  
Дата: 17.12.04 04:16
Оценка:
Всем большое спасибо, пока все ясно. Вчера забыл поблагодарить.
Очень всем признателен.
Лень — это не врожденное чувство советского человека, а средство борьбы с неуемной, но бестолковой энергией начальника...
Re[3]: Как залить файлы с клиента на сервер по HTTP
От: King Oleg Украина http://kingoleg.livejournal.com
Дата: 17.12.04 10:55
Оценка:
Здравствуйте, morok, Вы писали:

M>А как происходит сам Upload?

M>То есть нажимает клиент submit и...
Разобрались?
King Oleg
*Читайте DOC'и, они rules*
Re[4]: Как залить файлы с клиента на сервер по HTTP
От: morok Россия  
Дата: 17.12.04 10:58
Оценка:
Здравствуйте, King Oleg, Вы писали:

KO>Здравствуйте, morok, Вы писали:


M>>А как происходит сам Upload?

M>>То есть нажимает клиент submit и...
KO>Разобрались?

Да что происходит разобрался, вот только может и не совсем все понял.

Как эти данные потом разобрать в cgi скрипте на с++.
Лень — это не врожденное чувство советского человека, а средство борьбы с неуемной, но бестолковой энергией начальника...
Re[5]: Как залить файлы с клиента на сервер по HTTP
От: King Oleg Украина http://kingoleg.livejournal.com
Дата: 17.12.04 11:22
Оценка:
Здравствуйте, morok, Вы писали:

M>Да что происходит разобрался, вот только может и не совсем все понял.


M>Как эти данные потом разобрать в cgi скрипте на с++.

По стандарту CGI. Собираешь все, что в аргументах, переменных окружениях и в STDIN — вот тебе и все параметры.
Парсишь STDIN на предмет наличия файлов — вот тебе и файл.

Как — написано в спецификации CGI.
King Oleg
*Читайте DOC'и, они rules*
Re[6]: Как залить файлы с клиента на сервер по HTTP
От: morok Россия  
Дата: 17.12.04 14:13
Оценка:
Здравствуйте, King Oleg, Вы писали:

KO>Парсишь STDIN на предмет наличия файлов — вот тебе и файл.


Спасибо за предидущий совет.

Я как в том мультфильме — " а дальше "

Допустим я получил бинарный файл, и его content-type как мне теперь сохранить этот файл на сервере (желательно целым и не вредимым ). И главное определить тип этого файла, что бы потом его соответственно обработать.

Заранее спасибо
Лень — это не врожденное чувство советского человека, а средство борьбы с неуемной, но бестолковой энергией начальника...
Re[5]: Как залить файлы с клиента на сервер по HTTP
От: glyph  
Дата: 17.12.04 15:01
Оценка:
Здравствуйте, Vamp, Вы писали:

V>А причем тут PHP?

Сорри, скролл-бар просмотрел...
Re: Как залить файлы с клиента на сервер по HTTP
От: morok Россия  
Дата: 21.12.04 12:53
Оценка:
Помогите пожалуйста.
Вот код — при попытке считать из буфера не iCL*0.97 а весь размер пришедший из
переменной CONTENT_LENGTH приложение зависает на этапе чтения.
Просто может есть какая нибудь фишка в считывании контента формы с файлом? А я ее не знаю.

 char* pCL = getenv( "CONTENT_LENGTH" );
        char* str = NULL;
        if( pCL != NULL )
       {
            int iCL = atoi( pCL );
            if ( iCL > 0 )
            {
                 str = new char[iCL + 1];
                if( str != NULL )
        {
                  if( iCL > 0 )
                     fread( str, sizeof( char ), ((size_t)(iCL*0.97)), stdin );
                   
                  str[((size_t)(iCL*0.97))] = '\0';
                  printf("%s", str);
                  delete[] str;
        }
            }
            
    }


Заранее спасибо.
Лень — это не врожденное чувство советского человека, а средство борьбы с неуемной, но бестолковой энергией начальника...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.