![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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?