以二进制分块上传大文件到数据库要怎么实现。
各位帮帮忙,最好提供代码。

解决方案 »

  1.   


    protected void btnUpload_Click(object sender, EventArgs e)
        {
            //如果选择了文件进行上传
            if (FileUpload1.HasFile)
            {
                string fileName = FileUpload1.FileName;
                int contentLength = FileUpload1.PostedFile.ContentLength;
                string mime = FileUpload1.PostedFile.ContentType;
                byte[] data = FileUpload1.FileBytes;
                //所有图片文件的MIME都是以image/开始的,如:jpg图片的Mime为:image/pjpeg
                //如果上传的是图片文件
                if (mime.StartsWith("image/"))
                {
                    string sql = "insert into FileList(FileName,FileData,FileLength,Mime)values(@FileName,@FileData,@FileLength,@Mime)";
                    SqlParameter[] parameters = new SqlParameter[4];
                    parameters[0] = new SqlParameter("@FileName", SqlDbType.NVarChar, 50);
                    parameters[0].Value = fileName;                parameters[1] = new SqlParameter("@FileData", SqlDbType.Image, int.MaxValue);
                    parameters[1].Value = data;                parameters[2] = new SqlParameter("@FileLength", SqlDbType.Int, 4);
                    parameters[2].Value = contentLength;                parameters[3] = new SqlParameter("@Mime", SqlDbType.VarChar, 50);
                    parameters[3].Value = mime;                SqlDbHelper helper = new SqlDbHelper(ConfigurationManager.ConnectionStrings["Conn"].ConnectionString);
                    if (helper.ExecuteNonQuery(sql, CommandType.Text, parameters) > 0)
                    {
                        Response.Write("<script language='javascript'>alert('上传成功!');</script>");
                    }
                    else
                    {
                        Response.Write("<script language='javascript'>alert('上传失败');</script>");
                    }
                }
                else
                {
                    Response.Write("<script language='javascript'>alert('请上传图片文件');</script>");
                }
            }
            else
            {
                Response.Write("<script language='javascript'>alert('请选择上传文件');</script>");
            }
      

  2.   

    关键点:
    1、使用参数化SQL语句或者存储过程;
    2、将文件转换成字节数组;
    3、将字节数组作为参数给相应字段复制。
    4、用ADO.NET对象执行相应的操作。
      

  3.   

    读取数据库中Image字段内容:int fileId;
            //如果传过来的参数能转换成数字
            if (int.TryParse(Request.QueryString["FileID"], out fileId))
            {
                string sql = "select Mime,FileData from FileList where FileID=@FileID";
                //SqlDbHelper是我们自己编写的数据库通用类
                SqlDbHelper helper = new SqlDbHelper(ConfigurationManager.ConnectionStrings["Conn"].ConnectionString);
                SqlParameter[] parameters = new SqlParameter[1];
                parameters[0] = new SqlParameter("@FileID", SqlDbType.Int, 4);
                parameters[0].Value = fileId;
                SqlDataReader reader = helper.ExecuteReader(sql,CommandType.Text,parameters);
                byte[] data = null;
                string mime = string.Empty;
                //如果存在图片记录,所以按编号查询最多只有一条记录
                //这里就用if判断而不用while循环
                if (reader.Read())
                {
                    //将数据库中的image字段保存的数据转换成byte[]
                    data = (byte[])(reader["FileData"]);
                    mime = (string)(reader["mime"]);
                }
                reader.Close();//读取数据之后及时关闭Reader对象
                if (data != null && data.Length > 0)
                {
                    Response.Clear();//清空所有输出
                    Response.ContentType = mime;//设置MIME为图象对应的MIME
                    //因为不存在直接将byte[]转换成图象的方法
                    //所以利用byte[]来构建内存流对象
                    MemoryStream memoryStream = new MemoryStream(data);
                    //利用流对象构建Bitmap对象
                    Bitmap image = new System.Drawing.Bitmap(memoryStream);
                    //将Bitmap保存到Response对象的输出流当中
                    image.Save(Response.OutputStream, ImageFormat.Jpeg);
                    image.Dispose();//释放Bitmap对象
                    Response.End();
                }
            }关键是将数据库字段的内容读取出来转换成字节数组,有文件的字节数组就可以创建具体的文件用于操作的。
      

  4.   

    建议分层来做,服务器和客户端之间定义一种传协议,然后把大文件分为几块,一块一块的去传,这样做断点续传也好做一些;不要直接用ado.net来做,
      

  5.   


            /// <summary>
            /// 以二进制形式存取图片
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
                   private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
            {
                try
                {
                    this.pictureBox1.Image = Image.FromStream(this.openFileDialog1.OpenFile());
                    string str = openFileDialog1.FileName.ToString();
                    //将指定路径的文件添加到FileStream类中
                    FileStream fs = new FileStream(str, FileMode.Open, FileAccess.Read);
                    //通过FileStream类对象实例化BinaryReader类
                    BinaryReader br = new BinaryReader(fs);
                    //通过BinaryReader类对象的ReadBytes()方法将FileStream类对象转化为二进制数组
                    imgBytesIn = br.ReadBytes((int)fs.Length);
                    //MessageBox.Show(imgBytesIn.ToString());
                }
                catch
                {
                    MessageBox.Show("您选择的图片不能被读取或文件类型不对!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    this.pictureBox1.Image = null;
                }
            }
            string tablename = "cpic";
            private void btAddPic_Click(object sender, EventArgs e)
            {
                //new Db().InsertInfo_Clpic(cph, imgBytesIn);
                if (this.pictureBox1.Image == null)
                {
                    return;
                }
                new Db().InsertInfo_Clpic(tablename,cph, imgBytesIn);
                new Db().CloseConnection();
                btAddPic.Enabled = false;
                MessageBox.Show("添加成功!");
                btUpPic.Enabled = true;
                btDelPic.Enabled = true;
            }
      

  6.   

    Google: c# 大文件 数据库 上传
      

  7.   

    public byte[] UpLoadFile(HtmlInputFile f_IFile) 

     HttpPostedFile upFile=f_IFile.PostedFile; 
     int upFileLength=upFile.ContentLength; 
     string contentType = upFile.ContentType; 
     byte[] FileArray=new Byte[upFileLength]; 
     Stream fileStream=upFile.InputStream; 
      fileStream.Read(FileArray,0,upFileLength); 
     return FileArray; 
      

  8.   

    还可以用linq来写,这样代码会更简洁一些!