急C# 高手进来帮忙 以二进制上传大文件到数据库 以二进制分块上传大文件到数据库要怎么实现。各位帮帮忙,最好提供代码。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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>"); } 关键点:1、使用参数化SQL语句或者存储过程;2、将文件转换成字节数组;3、将字节数组作为参数给相应字段复制。4、用ADO.NET对象执行相应的操作。 读取数据库中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(); } }关键是将数据库字段的内容读取出来转换成字节数组,有文件的字节数组就可以创建具体的文件用于操作的。 建议分层来做,服务器和客户端之间定义一种传协议,然后把大文件分为几块,一块一块的去传,这样做断点续传也好做一些;不要直接用ado.net来做, /// <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; } Google: c# 大文件 数据库 上传 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; } 还可以用linq来写,这样代码会更简洁一些! 关于c#的正则表达式 在JS中取得text控件中输入的字符串的长度 RecordSet问题 dataGridView实时刷新 winform如何展示3D max UTF-8写文件 求助!!!关于相对路径问题,急!!!在线等待...... 一个关于MessageBox的问题 C# winform combobox 动态添加 item,item要有value与text两个属性 DataGrid中comobox问题??? C#保存配置参数 冒泡排序算法只适用小数组(小于等于10的),那大数据量时用什么算法呢?
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>");
}
1、使用参数化SQL语句或者存储过程;
2、将文件转换成字节数组;
3、将字节数组作为参数给相应字段复制。
4、用ADO.NET对象执行相应的操作。
//如果传过来的参数能转换成数字
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();
}
}关键是将数据库字段的内容读取出来转换成字节数组,有文件的字节数组就可以创建具体的文件用于操作的。
/// <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;
}
{
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;
}