Здраствуйте.
Заранее говорю, что поиск по сайту не дал вразумительных ответов, поэтому и было решено задать вопрос.
А вопрос вот какой:
Я разрабатываю интернет приложение — которое является по-сути форумом со своей спецификой. И необходимо реализовать передачу файлов. То есть, чтобы клиент мог прикрепить к сообщению файл, который сохранился бы на сервере, и в дальнейшем мог бы быть просмотрен другими клиентами. Как реализовать данный механизм? Приложение реализуется на 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
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);
}
Здравствуйте, 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
Здравствуйте, King Oleg, Вы писали:
KO>Здравствуйте, morok, Вы писали:
M>>А как происходит сам Upload? M>>То есть нажимает клиент submit и... KO>Разобрались?
Да что происходит разобрался, вот только может и не совсем все понял.
Как эти данные потом разобрать в cgi скрипте на с++.
Лень — это не врожденное чувство советского человека, а средство борьбы с неуемной, но бестолковой энергией начальника...
Re[5]: Как залить файлы с клиента на сервер по HTTP
Здравствуйте, morok, Вы писали:
M>Да что происходит разобрался, вот только может и не совсем все понял.
M>Как эти данные потом разобрать в cgi скрипте на с++.
По стандарту CGI. Собираешь все, что в аргументах, переменных окружениях и в STDIN — вот тебе и все параметры.
Парсишь STDIN на предмет наличия файлов — вот тебе и файл.
Здравствуйте, King Oleg, Вы писали:
KO>Парсишь STDIN на предмет наличия файлов — вот тебе и файл.
Спасибо за предидущий совет.
Я как в том мультфильме — " а дальше "
Допустим я получил бинарный файл, и его content-type как мне теперь сохранить этот файл на сервере (желательно целым и не вредимым ). И главное определить тип этого файла, что бы потом его соответственно обработать.
Заранее спасибо
Лень — это не врожденное чувство советского человека, а средство борьбы с неуемной, но бестолковой энергией начальника...
Re[5]: Как залить файлы с клиента на сервер по HTTP
Помогите пожалуйста.
Вот код — при попытке считать из буфера не iCL*0.97 а весь размер пришедший из
переменной CONTENT_LENGTH приложение зависает на этапе чтения.
Просто может есть какая нибудь фишка в считывании контента формы с файлом? А я ее не знаю.