Главная страница
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.035 c
2-1171975449
Познающий
2007-02-20 15:44
2007.03.11
Доступ к ресурсам


15-1171438394
Rouse_
2007-02-14 10:33
2007.03.11
А вы говорите зачем в Москве много зарабатывать?


3-1166092044
Alex1884
2006-12-14 13:27
2007.03.11
Не могу сделать связьмежду ComboBox и базой данных


15-1171602255
Думкин
2007-02-16 08:04
2007.03.11
Как надо сдавать зачеты. :)


15-1170142655
k2
2007-01-30 10:37
2007.03.11
Поздравляю с рождением дочки!