Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TIdMultiPartFormDataStream и большие файлы. [D7, WinXP]


vedm ©   (2006-10-02 20:31:00) 

Здраствуйте.
Стоит такая задача: через POST на сервер заливается файл. Сервер понимает только UTF8 в имени файла, поэтому способ:

data.AddFile('fl1',fname,'FILE');


не проходит, тк fname не является UTF8. Вариант с перекодировкой тоже не подходит:

data.AddFile('fl1',UTF8Encode(fname),'FILE');

т.к. в таком случае AddFile просто не может открыть файл по указанному пути для чтения.

Тогда мне пришлось использовать вариант с потоками:

fs : TMemoryStream;
...
fs := TMemoryStream.Create;
fs.LoadFromFile(fp);
...
data.AddObject('fl1','FILE',fs,UTF8Encode( ExtractFileName(fp) ));

в таком случае соответственно все работает прекрасно, пока размер загружаемого в fs остается маленьким. При попытке скажем загрузки файла размером 150 - 300 мегабайт программо "думает" приличное время. При попутке закинуть 1.4 гб соот ничего не выходит - ругается на отсутствие нужного кол-ва памяти, что и понятно.

Собственно вопрос: Каким образом можно решить данную ситуацию ?
Может быть можно использовать AddFile , а потом изменить имя файла на закодированное в UTF8. Т.е. необходимо чтобы на сервер имя файла приходило в UTF8, иначе не понимает.

Или же может быть предложите какой то вариант с чтением / постом файла по частям ?


Орион   (2006-10-02 23:34:00) [1]

напиши наследника от TIdMultiPartFormDataStream.
Перекрой AddFile и сделай так как нужно.

Собсно я не проверял, но может быть:
procedure TIdMultiPartFormDataStream.AddFile(const AFieldName, AFileName,
 AContentType: string);
var
 LStream: TFileStream;
 LItem: TIdFormDataField;
begin
 LStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
 try
   LItem := FFields.Add;
 except
   FreeAndNil(LStream);
   raise;
 end;

 with LItem do begin
   FFieldName := AFieldName;
   FFileName := UTF8Encode(AFileName );
   FFieldObject := LStream;
   FCanFreeFieldObject := True;
   if Length(AContentType) > 0 then begin
    FContentType := AContentType;
   end else begin
     FContentType := GetMIMETypeFromFile(AFileName);
   end;
 end;

 FSize := FSize + LItem.FieldSize;
end;


Орион   (2006-10-02 23:14:00) [2]

TFileStream?


Наверх

Титульная страница Поиск, карта сайта Написать письмо