как правильно передавать большие файлы
От: Kingofastellarwar Украина  
Дата: 01.04.09 19:38
Оценка:
В общем как сделать правильный нетяжёлый для сервера слив файлов

я насобирал разных советов и родил такое, но оно под IE вообще не работает, а под остальными работает как-то неправильно, нет процедуры закачки как таковой

чувствую это порно, не тот метод, хотя в инете его почему-то используют

string path = Server.MapPath(/*путьььььььь*/);

System.IO.FileInfo fi = new FileInfo(path);

Response.Clear();
Response.ContentType  =  "application/octet-stream";
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", Path.GetFileName(path)));
Response.AddHeader("Content-Length", fi.Length.ToString());

long sent = 0;
long left = fi.Length;

while(left > 0)
{
    if(Context.Response.IsClientConnected)
    {
        long block = 1024;
        if(left < 1024)
        {
            block = left;
        }

        Response.WriteFile(path, sent, block);
        Response.Flush();

        sent += block;
        left -= block;
    }
}
Response.End();
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: как правильно передавать большие файлы
От: игппук Беларусь  
Дата: 01.04.09 21:33
Оценка:
а зачем вы кусками сливаете файл? передавайте сразу весь, а об остальном пускай браузер парится.
проклятый антисутенерский закон
Re[2]: как правильно передавать большие файлы
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 02.04.09 22:26
Оценка:
Здравствуйте, игппук, Вы писали:

И>а зачем вы кусками сливаете файл? передавайте сразу весь, а об остальном пускай браузер парится.


Да не, тут дело в другом. Подобные решения позволяют не поднимать сразу весь файл в оперативку на сервере. Ну и HTTP-streaming примерно так же сделают. Только вот где вы раскопали эту реализацию — непонятно. Какая-то она уж очень стрёмная. Во-первых, буфер в 1к на современных каналах это нонсенс — сервер будет тормозить процесс. Во-вторых, каждый вызов HttpResponse::WriteFile внутри открывает и закрывает файл (читай — хэндл), что является источником тормозов на ровном месте.
В общем, советую как следует пересмотреть этот код...
[КУ] оккупировала армия.
Re: как правильно передавать большие файлы
От: Mikluho Россия  
Дата: 07.04.09 07:40
Оценка:
Здравствуйте, Kingofastellarwar, Вы писали:

K>В общем как сделать правильный нетяжёлый для сервера слив файлов


K>я насобирал разных советов и родил такое, но оно под IE вообще не работает, а под остальными работает как-то неправильно, нет процедуры закачки как таковой


K>чувствую это порно, не тот метод, хотя в инете его почему-то используют


K>
K>string path = Server.MapPath(/*путьььььььь*/);

K>System.IO.FileInfo fi = new FileInfo(path);

K>Response.Clear();
K>Response.ContentType  =  "application/octet-stream";
K>Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", Path.GetFileName(path)));
K>Response.AddHeader("Content-Length", fi.Length.ToString());

K>long sent = 0;
K>long left = fi.Length;

K>while(left > 0)
K>{
K>    if(Context.Response.IsClientConnected)
K>    {
K>        long block = 1024;
K>        if(left < 1024)
K>        {
K>            block = left;
K>        }

K>        Response.WriteFile(path, sent, block);
K>        Response.Flush();

K>        sent += block;
K>        left -= block;
K>    }
K>}
K>Response.End();    
K>


или уж пиши из файлового потока в выходной поток с буфером не менее 64к, или смотри в сторону HttpResponse.TransmitFile
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.