Форум: "Сети";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.041 c