Для веб хендлерра нужно вытичать файл и отдать его в Response.
Вот только как на основе существующего файла определить его сontent type.
public void ProcessRequest (HttpContext context)
{
context.Response.ContentType = "image/jpeg"; //"text/plain" и тп.
context.Response.WriteFile(FullRealPath);
}
тоесть FullRealPath может указывать на любой файл — картинку, архив, видео...
и естественно нужно задавать корректный ContentType для каждого файла.
Если ContentType не задан корректно, то как правило будет открываться как текст.
Тоесть содерживое бинарного файла будет выводиться в браузер.
Как тут быть?
Здравствуйте, Duke_Nuken, Вы писали:
D_N>Как тут быть?
Взять компонент MimeDetector, в обработчике (System.Web.IHttHandler) выдавать поток бинарного файла пачками, к примеру, по 100 байт так:
context.Response.BinaryWrite(bytes);
По первым 100 байтам (на самом деле хватит и меньше; то есть как у вас написано — не делайте, возможны тормоза) определить Content-Type примерно таким кодом:
private static string GetContentType(byte[] bytes) {
MimeTypes types = (MimeTypes) HttpRuntime.Cache["mimeTypes"];
if (types == null) {
types = new MimeTypes();
HttpRuntime.Cache["mimeTypes"] = types;
}
sbyte[] data = SupportUtil.ToSByteArray(bytes);
MimeType type = types.GetMimeType(data);
if (type != null)
return type.Name;
return string.Empty;
}
Стоит это хозяйство кэшировать, иначе при каждом определении MimeDetector будет заново зачитывать свой конфигурационный файл (в нем хранится соответствие Content-Type и заголовка, можно свои типы добавлять, в принципе).
PS Прикрутил MimeDetector к своему BinaryHandler-у минут за 30 — работает отлично, жалоб не имею.
Да, работает довольно не плохо. Вот только с этими хендлерами попутно еще одна проблемма.
Дето в том что когда запрашиваеться файл и он отдаеться через хендлер, то как при сохранении
указать его оригинальное имя. Тоесть например файл my.mp3 и запрос на него www.something.com/file.ashx?filename=my.mp3
то когда хендлер вычитает этот файл и отдаст его в респорс, то браузер предложит его сохранить,
но имя файла для сохранения будет file.ashx, а не my.mp3. Как то это можно изменить?
Здравствуйте, rsn81, Вы писали: R>Взять компонент MimeDetector, в обработчике (System.Web.IHttHandler) выдавать поток бинарного файла пачками, к примеру, по 100 байт так:
context.Response.BinaryWrite(bytes);
По первым 100 байтам (на самом деле хватит и меньше; то есть как у вас написано — не делайте, возможны тормоза) определить Content-Type примерно таким кодом:
Стоит это хозяйство кэшировать, иначе при каждом определении MimeDetector будет заново зачитывать свой конфигурационный файл (в нем хранится соответствие Content-Type и заголовка, можно свои типы добавлять, в принципе).
R>PS Прикрутил MimeDetector к своему BinaryHandler-у минут за 30 — работает отлично, жалоб не имею.
Здравствуйте, Duke_Nuken, Вы писали:
D_N>Да, работает довольно не плохо. Вот только с этими хендлерами попутно еще одна проблемма. D_N>Дето в том что когда запрашиваеться файл и он отдаеться через хендлер, то как при сохранении D_N>указать его оригинальное имя. Тоесть например файл my.mp3 и запрос на него www.something.com/file.ashx?filename=my.mp3 D_N>то когда хендлер вычитает этот файл и отдаст его в респорс, то браузер предложит его сохранить, D_N>но имя файла для сохранения будет file.ashx, а не my.mp3. Как то это можно изменить?
1. Оверквотинг и топпостинг не рулят.
2. Это уже вопрос по HTTP, не по ASP. Тебе нужно Content-Disposition: attachment; filename="porn.avi".
3. Если IIS умеет отдавать файлы с любыми расширениями, то научите, наконец, RSDN Team этому! А то с files.rsdn.ru файлы с неизвестными ему расширениями не отдаются.
В результате выпадает окошко сохранения с корректным именем файла. Что и требовалось.
Здравствуйте, Roman Odaisky, Вы писали:
RO>1. Оверквотинг и топпостинг не рулят. RO>2. Это уже вопрос по HTTP, не по ASP. Тебе нужно Content-Disposition: attachment; filename="porn.avi". RO>3. Если IIS умеет отдавать файлы с любыми расширениями, то научите, наконец, RSDN Team этому! А то с files.rsdn.ru файлы с неизвестными ему расширениями не отдаются.
Здравствуйте, Roman Odaisky, Вы писали: RO>3. Если IIS умеет отдавать файлы с любыми расширениями, то научите, наконец, RSDN Team этому!
Нет, не умеет. By design.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Roman Odaisky, Вы писали: RO>>3. Если IIS умеет отдавать файлы с любыми расширениями, то научите, наконец, RSDN Team этому! S>Нет, не умеет. By design.
Здравствуйте, mogadanez, Вы писали: M>хмм... если мы об одном и том же, "IIS 6.0 does not serve unknown MIME types" M>то это можно настроить: http://support.microsoft.com/default.aspx/kb/326965
Ну нифига себе!
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, mogadanez, Вы писали: M>>хмм... если мы об одном и том же, "IIS 6.0 does not serve unknown MIME types" M>>то это можно настроить: http://support.microsoft.com/default.aspx/kb/326965 S>Ну нифига себе!
атож....
P.S. время видел, знаю.... но в магадане уже наступиЛ =))
Можно както заставить браузер читать хедер как юникод?
RO>>1. Оверквотинг и топпостинг не рулят. RO>>2. Это уже вопрос по HTTP, не по ASP. Тебе нужно Content-Disposition: attachment; filename="porn.avi". RO>>3. Если IIS умеет отдавать файлы с любыми расширениями, то научите, наконец, RSDN Team этому! А то с files.rsdn.ru файлы с неизвестными ему расширениями не отдаются.
Если закодировать Server.UrlPathEncode(filename) то пашет, но только для IE, а firefox фигню роказывает
а не имя файла. С HttpUtility.UrlPathEncode(filename) таже фигня.
Здравствуйте, rameel, Вы писали:
R>Здравствуйте, Duke_Nuken, Вы писали:
D_N>>Можно както заставить браузер читать хедер как юникод?
R>Re[5]: Загрузка файла на клиента
Здравствуйте, Duke_Nuken, Вы писали:
D_N>Если закодировать Server.UrlPathEncode(filename) то пашет, но только для IE, а firefox фигню роказывает D_N>а не имя файла. С HttpUtility.UrlPathEncode(filename) таже фигня.
Для Firefox ничего кодировать не надо, он и так понимает. Смотри внимательно код. Вот насчет Оперы не знаю, проверяй сам
Здравствуйте, Duke_Nuken, Вы писали:
D_N>Вот тут проблемма нашлась. Если имя файла написано в юникоде, D_N>то при скачивании сохраняет каракули всякие. D_N>
D_N>Можно както заставить браузер читать хедер как юникод?
Я полагаю, что стоит почитать RFC 2047. RO>>>1. Оверквотинг и топпостинг не рулят. RO>>>2. Это уже вопрос по HTTP, не по ASP. Тебе нужно Content-Disposition: attachment; filename="porn.avi". RO>>>3. Если IIS умеет отдавать файлы с любыми расширениями, то научите, наконец, RSDN Team этому! А то с files.rsdn.ru файлы с неизвестными ему расширениями не отдаются.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.