Я работаю над веб-приложением, которое включает в себя возможность сохранять загруженные файлы. Файлы хранятся в базе данных SQL в столбце «изображение» и передаются через страницу GetFile.aspx с использованием Response.BinaryWrite ().
До вчерашнего дня у меня были проблемы с загрузкой файлов Office 2007/2010. Файл загружался бы без проблем, но когда Word (или Excel, или любая другая программа Office) открывали его, он жаловался на поврежденный файл. Но он все равно откроется без каких-либо явных проблем или пропущенных данных. Решение оказалось включить заголовок Content-Length в ответ:
If dr.Read() Then
Response.Clear()
Response.Buffer = True
Response.AppendHeader("Content-disposition", "attachment;filename=" + Server.UrlEncode(dr("FileName").ToString()))
Response.AppendHeader("Content-Length", dr("ContentSize").ToString())
Response.ContentType = dr("ContentType").ToString()
Response.BinaryWrite(dr("FileContent"))
End If
dr.Close()
Response.Flush()
Response.End()
dr
- это SqlDataReader.
Это прекрасно работало на моей локальной машине разработчика (Windows 7, IIS 7.5, ASP 2.0). Файлы загружаются и открываются без проблем. Но на нашем тестовом сервере (Windows Server 2003, IIS 6) это все еще проблема. Я посмотрел на трафик с помощью WireShark и обнаружил, что мой заголовок Content-Length отсутствует! Все остальное, что я настраиваю (включая заголовок теста: Response.AppendHeader("TestHeader", "TestValue")
. Обнаружено. Я убедился, что ContentSize имеет значение в данных, которые я получаю, и я даже попытался изменить его на Response.AppendHeader("Content-Length", "1234567")
, чтобы просто получить значение там . Ничего не появляется!
Я также попробовал Фиддлера посмотреть на трафик; моя машина разработки действительно содержит свойство content-length (хотя оно, очевидно, отключено на один байт ... Fiddler сообщил о нарушении протокола), а тестовый сервер - нет!
Что происходит? IIS 6 игнорирует заголовок по какой-то причине? Нужно ли изменить настройку?