Работа с 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 удалит его, а утилизация закроет его.

Другие вопросы по тегам