Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.11;
Скачать: CL | DM;

Вниз

TIdMultiPartFormDataStream и большие файлы.   Найти похожие ветки 

 
vedm   (2006-10-02 20:31) [0]

Здраствуйте.
Стоит такая задача: через 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:14) [1]

TFileStream?


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

напиши наследника от 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;



Страницы: 1 вся ветка

Текущий архив: 2007.03.11;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.05 c
15-1171255415
Slider007
2007-02-12 07:43
2007.03.11
С днем рождения ! 11 февраля


2-1171805222
GTR86
2007-02-18 16:27
2007.03.11
Как показать окна программ, запущенных пользователем?


15-1171561649
alien1769
2007-02-15 20:47
2007.03.11
Вакансия для программиста на С++


15-1171543920
vasIZmax
2007-02-15 15:52
2007.03.11
Поиск...


15-1171461962
IMHO
2007-02-14 17:06
2007.03.11
Опрос: программа для создания иконок