像我们做项目时,应该少不了增删改查,图片的上传也是经常遇到,今天我就向大家说下怎么预览图片以及保存图片吧。
首先看下前端样式,我从部分代码中截取一部分给大家展示。
<Border Grid.Column="1" Grid.Row="12" Margin="16,46,10,-211" Grid.ColumnSpan="7">
<Image Grid.Column="1" Grid.Row="12" x:Name="img_photo" Grid.ColumnSpan="7" Margin="0,0,0,10"/>
</Border>
一个border内容标签中嵌套一张图片(Image),用来展示图片。
既然要预览,那一般少不了按钮触发,点击按钮预览图片。一个清除图片的按钮,将图片清除。
<Button x:Name="btn_File" Content=" 浏览" Grid.Column="0" Grid.Row="12" Margin="0,10,0,-24" Height="33" VerticalAlignment="Top" Click="btn_File_Click"/>
<Button x:Name="btn_Clear" Content=" 清空" Grid.Column="0" Grid.Row="12" Margin="0,57,0,-71" Height="33" VerticalAlignment="Top" Click="btn_Clear_Click"/>
设置一个点击事件,来触发预览。
部分样式效果:

点击事件后台代码如下:
privatevoid btn_File_Click(object sender,RoutedEventArgs e)
{
//声明两个变量
Stream photo = null;
int length;
//打开(文件框)
OpenFileDialog openFile = new OpenFileDialog();
//允许用户选择多个文件
openFile.Multiselect = true;//多选图片
//筛选文件类型(提示)
openFile.Filter = "ALL Image Files|*.*";
//显示对话框
if ((bool)openFile.ShowDialog())
{
//选定的文件(选定的文件打开只读流)
if ((photo =openFile.OpenFile()) != null)
{
//获取文件长度(用字节表示的流长度)
length = (int)photo.Length;
//声明数组
byte[] bytes = newbyte[length];
//读取文件(字节数组,从零开始的字节偏移量,读取字节数)
photo.Read(bytes, 0,length);
lstBytes.Add(bytes);
BitmapImage images = new BitmapImage(newUri(openFile.FileName));
//绑定图片
img_photo.Source = images; //图片
txt_Load.Text =openFile.FileName;//图片路径
}
}
}
//清空图片按钮
privatevoid btn_Clear_Click(object sender,RoutedEventArgs e)
{
//清理元素
lstBytes.Clear();
//清空图片框
img_photo.Source = null;
//去除路径
txt_Load.Text = string.Empty;
}
现在预览已经OK了,下面就剩保存图片到数据库了。首先声明一个List集合,里面用来接收图片的数据(byte数组类型)。
List<byte[]> lstBytes = new List<byte[]>();
接着就是提取图片了
//提取上传的文件
byte[][] bytepicture = newbyte[lstBytes.Count][];
for (int i = 0; i < lstBytes.Count; i++)
{
bytepicture[i] = lstBytes[i];//提取图片
}
至于客户端保存图片的方法就不说了,我们已经获取的图片的数据,只需将参数bytepicture进行放入保存函数内提交到服务端。
来到服务端,这里需要改下Web.config配置文件,不然报错,由于传递过来的图片数据过大,我们在<system.serviceModel>下加上以下几句代码即可:
<bindings>
<basicHttpBinding>
<bindingcloseTimeout="00:10:00"receiveTimeout="00:20:00"sendTimeout="00:20:00"maxBufferSize="2147483647"maxReceivedMessageSize="2147483647"/>
</basicHttpBinding>
</bindings>
接着就是在服务端保存这里要注意一点,因为我们这边图片是byte数组形式,而数据库中的图片格式是varchar(255),所以我们还需转换下一个格式类型,新增一个私有方法。
privatestring ConventFiles(byte[][] bytePicture)
{
try
{
string strSavePath;
//获取基目录,它由程序集冲突解决程序用来探测程序集。
string strPath =System.AppDomain.CurrentDomain.BaseDirectory + "image\\";
//第一步,判断文件夹image
if(!Directory.Exists(strPath))
{
//文件夹不存在;创建文件夹
Directory.CreateDirectory(strPath);
}
//拼接日期
StringBuilder str = new StringBuilder();
str.Append(DateTime.Now.Year.ToString());
str.Append(DateTime.Now.Month.ToString());
str.Append(DateTime.Now.Day.ToString());
str.Append(DateTime.Now.Minute.ToString());
str.Append(DateTime.Now.Second.ToString());
string strFileName = "";
//遍历二进制的数组的数组
for (int i = 0; i <bytePicture.Length; i++)
{
//文件命名:日期+后缀
str.Append(i.ToString());
str.Append(".png");
string strDateFile =str.ToString();
//拼接路径
strSavePath = strPath +strDateFile;//路径+ 名称(有前后缀)
FileInfo fi = newFileInfo(strSavePath);
FileStream fs;
//创建只写System.IO.FileStream。
fs = fi.OpenWrite();
fs.Write(bytePicture[i], 0,bytePicture[i].Length);
//关闭当前流并释放与之关联的所有资源
fs.Close();
strFileName = strDateFile;
}
//返回文件名
return strFileName;
}
catch (Exception)
{
throw;
}
}
然后就是声明一个变量,接收客户端接的图片的参数,调用该函数
string strPatientPhotos = ConventFiles(picture);
最后就是将该变量了赋值了
mySql[16].Value = strPatientPhotos;//文件名字
一个完整的图片保存就可以结束了。
首先看下前端样式,我从部分代码中截取一部分给大家展示。
<Border Grid.Column="1" Grid.Row="12" Margin="16,46,10,-211" Grid.ColumnSpan="7">
<Image Grid.Column="1" Grid.Row="12" x:Name="img_photo" Grid.ColumnSpan="7" Margin="0,0,0,10"/>
</Border>
一个border内容标签中嵌套一张图片(Image),用来展示图片。
既然要预览,那一般少不了按钮触发,点击按钮预览图片。一个清除图片的按钮,将图片清除。
<Button x:Name="btn_File" Content=" 浏览" Grid.Column="0" Grid.Row="12" Margin="0,10,0,-24" Height="33" VerticalAlignment="Top" Click="btn_File_Click"/>
<Button x:Name="btn_Clear" Content=" 清空" Grid.Column="0" Grid.Row="12" Margin="0,57,0,-71" Height="33" VerticalAlignment="Top" Click="btn_Clear_Click"/>
设置一个点击事件,来触发预览。
部分样式效果:

点击事件后台代码如下:
privatevoid btn_File_Click(object sender,RoutedEventArgs e)
{
//声明两个变量
Stream photo = null;
int length;
//打开(文件框)
OpenFileDialog openFile = new OpenFileDialog();
//允许用户选择多个文件
openFile.Multiselect = true;//多选图片
//筛选文件类型(提示)
openFile.Filter = "ALL Image Files|*.*";
//显示对话框
if ((bool)openFile.ShowDialog())
{
//选定的文件(选定的文件打开只读流)
if ((photo =openFile.OpenFile()) != null)
{
//获取文件长度(用字节表示的流长度)
length = (int)photo.Length;
//声明数组
byte[] bytes = newbyte[length];
//读取文件(字节数组,从零开始的字节偏移量,读取字节数)
photo.Read(bytes, 0,length);
lstBytes.Add(bytes);
BitmapImage images = new BitmapImage(newUri(openFile.FileName));
//绑定图片
img_photo.Source = images; //图片
txt_Load.Text =openFile.FileName;//图片路径
}
}
}
//清空图片按钮
privatevoid btn_Clear_Click(object sender,RoutedEventArgs e)
{
//清理元素
lstBytes.Clear();
//清空图片框
img_photo.Source = null;
//去除路径
txt_Load.Text = string.Empty;
}
现在预览已经OK了,下面就剩保存图片到数据库了。首先声明一个List集合,里面用来接收图片的数据(byte数组类型)。
List<byte[]> lstBytes = new List<byte[]>();
接着就是提取图片了
//提取上传的文件
byte[][] bytepicture = newbyte[lstBytes.Count][];
for (int i = 0; i < lstBytes.Count; i++)
{
bytepicture[i] = lstBytes[i];//提取图片
}
至于客户端保存图片的方法就不说了,我们已经获取的图片的数据,只需将参数bytepicture进行放入保存函数内提交到服务端。
来到服务端,这里需要改下Web.config配置文件,不然报错,由于传递过来的图片数据过大,我们在<system.serviceModel>下加上以下几句代码即可:
<bindings>
<basicHttpBinding>
<bindingcloseTimeout="00:10:00"receiveTimeout="00:20:00"sendTimeout="00:20:00"maxBufferSize="2147483647"maxReceivedMessageSize="2147483647"/>
</basicHttpBinding>
</bindings>
接着就是在服务端保存这里要注意一点,因为我们这边图片是byte数组形式,而数据库中的图片格式是varchar(255),所以我们还需转换下一个格式类型,新增一个私有方法。
privatestring ConventFiles(byte[][] bytePicture)
{
try
{
string strSavePath;
//获取基目录,它由程序集冲突解决程序用来探测程序集。
string strPath =System.AppDomain.CurrentDomain.BaseDirectory + "image\\";
//第一步,判断文件夹image
if(!Directory.Exists(strPath))
{
//文件夹不存在;创建文件夹
Directory.CreateDirectory(strPath);
}
//拼接日期
StringBuilder str = new StringBuilder();
str.Append(DateTime.Now.Year.ToString());
str.Append(DateTime.Now.Month.ToString());
str.Append(DateTime.Now.Day.ToString());
str.Append(DateTime.Now.Minute.ToString());
str.Append(DateTime.Now.Second.ToString());
string strFileName = "";
//遍历二进制的数组的数组
for (int i = 0; i <bytePicture.Length; i++)
{
//文件命名:日期+后缀
str.Append(i.ToString());
str.Append(".png");
string strDateFile =str.ToString();
//拼接路径
strSavePath = strPath +strDateFile;//路径+ 名称(有前后缀)
FileInfo fi = newFileInfo(strSavePath);
FileStream fs;
//创建只写System.IO.FileStream。
fs = fi.OpenWrite();
fs.Write(bytePicture[i], 0,bytePicture[i].Length);
//关闭当前流并释放与之关联的所有资源
fs.Close();
strFileName = strDateFile;
}
//返回文件名
return strFileName;
}
catch (Exception)
{
throw;
}
}
然后就是声明一个变量,接收客户端接的图片的参数,调用该函数
string strPatientPhotos = ConventFiles(picture);
最后就是将该变量了赋值了
mySql[16].Value = strPatientPhotos;//文件名字
一个完整的图片保存就可以结束了。