Как загрузить большой двоичный объект случайного типа на C # с помощью универсального обработчика http

Моя дилемма заключается в том, что мне нужно получить данные blob, хранящиеся в таблице в Oracle. Я создал ссылки с данными с помощью jquery, которые ссылаются на общий обработчик http blobHandler.ashx, где я запрашиваю базу данных для файла и возвращаю его пользователю. Это работает для изображений, которые открываются в браузере, но когда дело доходит до других типов файлов (pdf, word, excel), программа загружает только сам файл .ashx.

Как мне заставить его скачать файл с его расширением?

using (OracleConnection objConn = new OracleConnection(conStr))
        {
            using (OracleCommand cmd = new OracleCommand())
            {
                cmd.Connection = objConn;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "SELECT fl.file_content_type, fl.file_data,fl.file_name FROM fnd_lobs fl WHERE fl.file_id = " + mediano;

                try
                {
                    objConn.Open();
                    OracleDataReader dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {

                            OracleBlob blob = dr.GetOracleBlob(1);
                            FileStream FS = new FileStream(dr["file_name"].ToString(), FileMode.Create);
                            Byte[] byteArr = new Byte[blob.Length];
                            int i = blob.Read(byteArr,0,System.Convert.ToInt32(blob.Length));
                            MemoryStream memStream = new MemoryStream(byteArr);

                            context.Response.AddHeader("Content-disposition: inline", "attachment; filename=" + dr["file_name"]);
                            context.Response.ContentType = dr["file_content_type"].ToString();
                            context.Response.OutputStream.Write(byteArr,0,i);



                    }
                    }
                }
                catch(Exception exe)
                {
                    context.Response.Write(exe.Message);
                }
                finally
                {

                    cmd.Dispose();
                    //pcur.Dispose();
                    objConn.Close();
                    objConn.Dispose();
                    context.Response.Flush();
                    context.Response.End();
                }

            }
        }

Я использую .net framework 1.1, Visual Studio 2003, версию базы данных oracle 10.3.0.5

Заранее благодарю вас за любой совет, который вы могли бы дать, это мой первый вопрос.


person user2359298    schedule 07.05.2013    source источник


Ответы (1)


Вам необходимо установить правильный заголовок типа содержимого в объекте ответа, чтобы браузер знал, как обрабатывать ответ соответствующим образом.

Если вы хотите установить имя загруженного файла, вы можете посмотреть здесь.

person tucaz    schedule 07.05.2013
comment
спасибо за ваш ответ, я внес предложенные вами изменения и теперь получаю сообщение «Доступ к ‹path› запрещен. Вы когда-нибудь испытывали что-нибудь подобное? - person user2359298; 07.05.2013
comment
По какому пути вам отказано в доступе? - person tucaz; 08.05.2013
comment
путь - c: \ windows \ system32 \ inetsrv * - person user2359298; 09.05.2013
comment
Похоже, что доступ запрещен связан с доступом к базе данных при попытке доступа к некоторой разделяемой DLL или чему-то в этом роде в драйвере Oracle. Пожалуйста, опубликуйте всю трассировку стека - person tucaz; 09.05.2013