Главная страница
    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.036 c
2-1171743542
Странник81
2007-02-17 23:19
2007.03.11
Можно ли вывести содержимое ячеек StringGrid в динамический масси


15-1171530503
Лёша
2007-02-15 12:08
2007.03.11
Убрать неиспользуемые юниты в uses


2-1171881801
Kvinta
2007-02-19 13:43
2007.03.11
AppendRecord в ADO


2-1172056346
Sapos
2007-02-21 14:12
2007.03.11
DBNavigator


15-1171349221
chvank
2007-02-13 09:47
2007.03.11
Photoshop





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский