Работа с FileTable и ASP.NET C# (открыть PDF)
Я пытаюсь открыть PDF в браузере (или загрузить) PDF, когда пользователь нажимает на ссылку. Я нашел похожий вопрос по SO ( открытие файлов FileTable в C# /.net 4) и пытался реализовать ответ в своем коде, но мне не повезло. Мне просто нужно увидеть полный пример того, как открыть файл из FileTable в ASP.NET / C#.
Код:
public FileResult Download(int? id)
{
//start of my test code
Document document = db.Documents.Find(id);
string fileName;
byte[] fileData;
System.Guid path = document.DocumentPath;
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["FT_ConnectionString"].ConnectionString))
{
string sql = "SELECT TOP 1 file_stream, name, file_type, cached_file_size FROM FTAdvisoryOpinions WHERE stream_id = @SID";
using (var command = new SqlCommand(sql, connection))
{
command.Parameters.Add("@SID", SqlDbType.UniqueIdentifier).Value = path;
connection.Open();
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
//file_stream = 0
//name = 1
//file_type = 2
//cached_file_size = 3
long fileSize = reader.GetInt64(3); //think this might be wrong
string contentType = reader.GetString(2);
fileData = reader.GetBytes(0, 2, fileData, 0, fileSize); //says I have some invalid arguments
fileName = reader.GetString(1);
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
return File(fileData, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
else
{
connection.Close();
}
}
return null; // just returning null here til I figure it out.
}
}
}
1 ответ
Вместо того, чтобы читать размер капли через GetInt64
на сохраненном поле, вы можете получить эту информацию от звонка GetBytes
, Вызовите метод один раз, когда вы передаете размер 0. Результат скажет вам размер данных. Затем снова вызовите метод с массивом, достаточно большим для хранения данных, чтобы фактически прочитать данные.
Главное, что GetBytes
не возвращает байты, он возвращает информацию о том, сколько байтов осталось для чтения, и вы передаете структуру данных, в которую должны считываться байты в качестве аргумента.
PS: Если ваши данные большие, вы можете читать поток постепенно с максимальным размером буфера. Но вы должны быть в порядке без, по крайней мере, для начинающих.
PPS: Кроме того, я хочу упомянуть, что вам не нужно явно закрывать ваше соединение, так как блок using удалит его, а утилизация закроет его.