Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
2-1171975088
Nija
2007-02-20 15:38
2007.03.11
Просмотр Html кода


3-1160997686
Ольга
2006-10-16 15:21
2007.03.11
Проблема с Rave 5.0


2-1171880785
sergeyst
2007-02-19 13:26
2007.03.11
Редактирование записей БД


2-1171980520
koha
2007-02-20 17:08
2007.03.11
передать в функцию переменную любого типа


3-1166004678
TRESDA
2006-12-13 13:11
2007.03.11
Сохранение BLOB в таблицу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский