zoukankan      html  css  js  c++  java
  • 下载ORACLE中BLOB内容到客户端

    private void downLoad(string id)
            {
                string fileName = Page.Request.PhysicalApplicationPath + "SystemManage\\SysFile\\" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".zip";
                OracleConnection conn = null;
                string connString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString();
                using (conn = new OracleConnection(connString))
                {
                    try
                    {
                        conn.Open();
                        OracleCommand cmd = conn.CreateCommand();

                        // 利用事务处理(必须)
                        OracleTransaction transaction = cmd.Connection.BeginTransaction();
                        cmd.Transaction = transaction;

                        // 根据查询语句获取对应的上传文件的BLOB信息
                        string sql = "select 上传文件 from 文件上传表 where 编号 = " + id;
                        cmd.CommandText = sql;
                        OracleDataReader dr = cmd.ExecuteReader();
                        dr.Read();
                        OracleLob tempLob = dr.GetOracleLob(0);
                        dr.Close();

                        // 读取 BLOB 中数据,写入到文件中
                        FileStream fs = new FileStream(fileName, FileMode.Create);
                        int length = 1048576;
                        byte[] Buffer = new byte[length];
                        int i;
                        while ((i = tempLob.Read(Buffer, 0, length)) > 0)
                        {
                            fs.Write(Buffer, 0, i);
                        }
                        fs.Close();
                        tempLob.Clone();
                        cmd.Parameters.Clear();

                        // 提交事务
                        transaction.Commit();
                        DownloadFile(fileName);
                        File.Delete(fileName);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }

       /// <summary>
            /// 下载文件
            /// </summary>
            /// <param name="fileName">文件名称</param>
            public void DownloadFile(string fileName)
            {
                try
                {
                    //by K 2010-08-13 下载超过100M的附件  需要用以下方法
                    System.IO.Stream iStream = null;

                    // Buffer to read 10K bytes in chunk:
                    byte[] buffer = new Byte[10000];

                    // Length of the file:
                    int length;

                    // Total bytes to read:
                    long dataToRead;

                    // Identify the file to download including its path.
                    string filepath = fileName;

                    // Identify the file name.
                    string filename = System.IO.Path.GetFileName(filepath);

                    try
                    {
                        // Open the file.
                        iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
                        System.IO.FileAccess.Read, System.IO.FileShare.Read);


                        // Total bytes to read:
                        dataToRead = iStream.Length;

                        Response.ContentType = "application/octet-stream";
                        Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);

                        // Read the bytes.
                        while (dataToRead > 0)
                        {
                            // Verify that the client is connected.
                            if (Response.IsClientConnected)
                            {
                                // Read the data in buffer.
                                length = iStream.Read(buffer, 0, 10000);

                                // Write the data to the current output stream.
                                Response.OutputStream.Write(buffer, 0, length);

                                // Flush the data to the HTML output.
                                Response.Flush();

                                buffer = new Byte[10000];
                                dataToRead = dataToRead - length;
                            }
                            else
                            {
                                //prevent infinite loop if user disconnects
                                dataToRead = -1;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        // Trap the error, if any.
                        Response.Write("Error : " + ex.Message);
                    }
                    finally
                    {
                        if (iStream != null)
                        {
                            //Close the file.
                            iStream.Close();
                        }
                    }
                   
                }
                catch (Exception ex)
                {
                    AppCode.CommonFunc.AlertScript("对不起,文件下载时出现错误!");
                }
            }

  • 相关阅读:
    文件传输基础——Java IO流
    Oracle数据库之PL/SQL基础
    Oracle数据库之SQL基础(二)
    Oracle数据库之SQL基础(一)
    jQuery基础修炼圣典—DOM篇(二)jQuery遍历
    jQuery基础修炼圣典—DOM篇(一)
    Java静态代码分析工具——FindBugs插件的安装与使用
    javascript:void(0)和javascript:;的用法
    MySQL之数据类型与操作数据表
    Java数据库连接——JDBC调用存储过程,事务管理和高级应用
  • 原文地址:https://www.cnblogs.com/threestone/p/1798970.html
Copyright © 2011-2022 走看看