ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

CGI на Delphi. Проблема с file upload
  #1  
Старый 08.09.2007, 17:24
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию CGI на Delphi. Проблема с file upload

Пишу скрипт для загрузки файлов на сервер:

Код:
program upload;

{$APPTYPE CONSOLE}
{$E cgi}

uses
  windows;

var
  ch: char;
  s: string;
  buffer: PChar;
  contlength, ecode, i: integer;

procedure putfile(filename: string);
var
  f: textfile;
begin
  assignfile(f, filename);
  reset(f);
    while not (eof(f)) do
      begin
        readln(f,s);
        writeln(s);
      end;
  closefile(f);
end;

begin
  putfile('headers.txt');
  writeln;
  getmem(buffer, 256);
  if GetEnvironmentVariable('CONTENT_LENGTH',buffer,256) > 0 then
    begin
      val(buffer,contlength,ecode);
      s := '';
      for i := 1 to contlength do
        begin
          read(ch);
          s := s + ch;
        end;
      writeln(s);
      exit;
    end
  else
    begin
      putfile('top.txt');
      putfile('form.txt');
      putfile('bottom.txt');
    end;
  freemem(buffer);
end.
headers.txt :

Content-Type: text/html

top.txt :

<html>
<head>
<title>File Upload</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>


form.txt :

<style>
.tb td {padding: 5px}
</style>
<form method="post" encrypte="multipart/form-data">
<input type="hidden" name="checked" value="yes">
<table class="tb">
<tr><td><input type="file" name="filename"></td></tr>
<tr><td><input type="submit" value="Ok"></td></tr>
</table>
</form>


bottom.txt :

</body>
</html>


В итоге скрипт показывает строку POST параметров, а само содержимое файла нет. + CONTENT_LENGTH показывает размер POST данных, не учитывая размер файла. Что не так?
 
Ответить с цитированием

  #2  
Старый 08.09.2007, 18:40
Red_Red1
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме:
4608122

Репутация: 874
Отправить сообщение для Red_Red1 с помощью ICQ
По умолчанию

Мо моему переменная s инициализируется позже чем идет первое обращение к ней. В начале тела программы стоит putfile('headers.txt'); в которой уже нужна s. Остальное вроде аналогично. А может я и гоню...
 
Ответить с цитированием

  #3  
Старый 08.09.2007, 18:54
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

Код:
procedure putfile(filename: string);
var
  s: string;
  f: textfile;
begin
  assignfile(f, filename);
  reset(f);
    while not (eof(f)) do
      begin
        readln(f,s);
        writeln(s);
      end;
  closefile(f);
end;
Вот так правильней будет. Но сути проблемы не решает
 
Ответить с цитированием

  #4  
Старый 08.09.2007, 19:59
Red_Red1
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме:
4608122

Репутация: 874
Отправить сообщение для Red_Red1 с помощью ICQ
По умолчанию

Цитата:
Сообщение от Joker-jar  
Вот так правильней будет. Но сути проблемы не решает
Не будет правильней. Объявление переменой в процедуре не инициализирует ее! У нас идет обращение к переменой s в процедуре putfile('headers.txt'); в строке readln(f,s);. Но процедура putfile('headers.txt'); расположена в самом начале тела программы
begin
putfile('headers.txt');
writeln;
getmem(buffer, 256);
if GetEnvironmentVariable .....

и переменная s в этот момент еще не инициализирована, т.е. ни чему не равна. ЕЕ инициализация происходит уже НИЖЕ в строках
s := '';
for i := 1 to contlength do
begin
read(ch);
s := s + ch;
.....
А значит в начале програмы процедура putfile('headers.txt'); выполняется с неполными данными...
нету s. Она хоть и объявлена в процедуре но не инициализирована... Оттрасируй програмку и посмотри на значение s при выполнении putfile('headers.txt'); вначале...
 
Ответить с цитированием

  #5  
Старый 08.09.2007, 20:10
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

Тогда глобальная пусть будет не s а sd, s - локальная, там все нормально (putfile(filename: string) - подает содержимое файла filename на стандартный ввод, работает без глюков). В sd считываются данные со стандартного вывода, где, по идее, должно быть содержимое закачиваемого файла, но там кроме checked=yes&filename=1.txt ничего нет. Как добраться до него? Просьба помочь по делу.

Последний раз редактировалось Joker-jar; 08.09.2007 в 20:11.. Причина: Опечатка
 
Ответить с цитированием

  #6  
Старый 08.09.2007, 23:53
W!z@rD
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме:
1892597

Репутация: 836


Отправить сообщение для W!z@rD с помощью ICQ
По умолчанию

Joker-jar, а не проще ли использовать ApacheModule?
с этим модулем разобраться проще некуда...
не мучайте себя...
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
 
Ответить с цитированием

  #7  
Старый 09.09.2007, 00:52
Red_Red1
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме:
4608122

Репутация: 874
Отправить сообщение для Red_Red1 с помощью ICQ
По умолчанию

Да ДжокерДжар, я затупил с переменной s.... короче я неправ. Пытаюсь разобраться с програмкой... повторно. Скрипты для веба на дельфи это для меня новинка.
 
Ответить с цитированием

  #8  
Старый 09.09.2007, 09:57
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

Это не для практической, а для учебной цели (такое задание). А встал в самом начале
 
Ответить с цитированием

  #9  
Старый 13.09.2007, 17:14
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

Короче, почитал доки, поспрашивал задротов и вот что выяснил: Apache, прежде чем отдать http-запрос CGI-скрипту, вырезает оттуда блок данных файла и сохраняет его в свою временную директорию. Далее скрипт должен узнать путь к этой директории (через переменные окружения 'TEMP', 'TMP') и оттуда скопировать полученный файл / сделать с ним что угодно. Но тут снова появилось несколько вопросов. Никогда не слышал, чтоб у Apache была какая-то временная директория, что подтвердилось просмотром httpd.conf - никакого похожего параметра не нашел. Во-вторых, в переменных окружения отсутствует этот самый путь. У IIS есть, а вот у Apache нет (хотя это может быть и потому, что он не настроен как надо). Кто-нибудь знает, предусмотрена ли в httpd какая-нибудь команда, задающая путь ко временному каталогу. Второй вопрос - как Apache обзывает эти самые файлы, ведь реальные клиентские имена он не знает?
 
Ответить с цитированием

  #10  
Старый 15.09.2007, 06:56
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

С этим всем разобрался. Теперь надо парсить multipart... Вопрос закрыт

Последний раз редактировалось Joker-jar; 15.09.2007 в 10:47..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с Записью Cd-R Nova Аппаратное обеспечение 17 14.03.2009 17:59
Hacking IIS Tutorial bxN5 Forum for discussion of ANTICHAT 1 14.03.2007 23:44
Подскажите Chrek625 Болталка 6 11.01.2007 21:46
Нужна консультация (Intranet Chat) ty3ik Чаты 3 30.04.2006 19:15



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ