最近项目部署时,需要将客户拍摄的照片进行批量上传。附件格式
如上图所示,3725为图片对应的数据的一个主键,清老黑脸木偶捎子为数据的名称,文件夹下问这条数据的多个图片。
针对这部分我通过c#来设计了一个批量上传。先贴代码,下面在详细介绍
/// <summary>
/// 获取一级文件夹下的二级文件夹
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
folderBrowserDialog1.Description= "请选择文件路径";
//FolderBrowserDialog dialog = new FolderBrowserDialog();
folderBrowserDialog1.Description = "请选择文件路径";
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) {
string path = folderBrowserDialog1.SelectedPath;
DirectoryInfo directory = new DirectoryInfo(path);
//FileInfo[] filelist = directory.GetFiles("*", SearchOption.AllDirectories);
DirectoryInfo[] dics = directory.GetDirectories();
for (int m = 0; m < dics.Length; m++) {
if (dics[m] is DirectoryInfo) {
//Console.WriteLine(dics[m].FullName);
getfj(dics[m].FullName);
Console.WriteLine("完成:"+dics[m].FullName);
Thread.Sleep(200);
}
}
}
}
String crid=“”;//文件对应的数据库主键id
/// <summary>
/// 获取二级文件夹下的图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void getfj(String dicsa)
{
Console.WriteLine("开始:"+dicsa);
DirectoryInfo folder = new DirectoryInfo(dicsa);
String flo = folder.Name.Split(' ')[0];
Console.WriteLine(flo);
FileInfo[] files = folder.GetFiles();
String[] imgs = new String[files.Length];
String names = "";
for (int i = 0; i < files.Length; i++)
{
imgs[i] = files[i].FullName;
names = names + files[i].Name.Split('.')[0] + ",";
}
label1.Text = "开始";
savefj(flo, imgs, names);
}
/// <summary>
/// 处理文件名称和附件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void savefj(string flo, string[] imgs, string names)
{
try
{
if (!flo.Equals(""))
{
#region 查询藏品主键id
MySqlConnection conn = new MySqlConnection(connetStr);
try
{
conn.Open();//打开通道,建立连接,可能出现异
//处理文件的名称,在数据库中找到对应的数据,
String sql = "select id FROM 具体要查询的数据库表名称 where 文件对应的表中的字段 =" + flo.Trim().ToString();
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
crid = reader["id"].ToString();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}
#endregion
#region 上传附件信息
//这里的上传只是我个人的上传方式,可以替换
//string[] imgs = e.Data.GetData(DataFormats.FileDrop, false) as String[];
FtpUtils.compressImages(imgs);
//ftp原图上传
string imgYt = FtpUtils.ftpUpload(imgs, path, crid, "1");
//ftp压缩图上传
var ThumbnailPath = ConfigurationManager.AppSettings["ThumbnailPath"];//压缩图保存相对路径
string[] imgsYst = Directory.GetFiles(ThumbnailPath);
string imgYst = FtpUtils.ftpUpload(imgsYst, path, crid, "1");
//上传拍照
uploadPicture(imgs.Length, imgYt, imgYst, names);
#endregion
if (num == 1)
{
label1.Text = "附件上传成功!";
}
else
{
label1.Text = "附件上传失败!";
}
}
}
catch
{
MessageBox.Show("影像上传失败!");
}
}
/// <summary>
/// 图片上传,上传附件数据到对应的数据库中,如果只是上传不需要存储的,这里可以忽略
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
int num = 0;
private void uploadPicture(int length, string imgYt, string imgYst, string name)
{
if (!StringUtil.isEmpty(imgYt))
{
string[] ims = imgYt.Split(',');
string[] ys = imgYst.Split(',');
string[] nms = name.Split(',');
for (int i = 0; i < ims.Count(); i++)
{
if (ims[i] != "")
{
try
{
MySqlConnection conn = new MySqlConnection(connetStr);
try
{
conn.Open();//打开通道,建立连接,可能出现异
String sql = "INSERT into 具体的表名称 (cul_id,zylj,zylx,zylj_a,zymc) VALUES("+ crid+",'"+ ims[i]+"',1 ,'"+ ys[i] + "','" + nms[i] + "'); ";
MySqlCommand cmd = new MySqlCommand(sql, conn);
int result = cmd.ExecuteNonQuery();
if (result > 0)
{
num = 1;
}
else {
num = 0;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
conn.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
}
我本次上传的文件是有规律的,一级文件/数据id 数据名称/附件。我的整体思路是先获取一级文件夹下的二级文件,然后在获取二级文件夹下的所有图片上传就可以了。
上文中的与数据库的对接我使用的是MySqlConnection,如果大家有对应的与后端的接口也可以替换成具体的接口。
拓展功能:
在文件中我的上传文件才用的是c#的FolderBrowserDialog工具选择文件夹。如果只是简单的一级文件夹下的附件上上传。可以将上文中的button1_click内部的方法替换成下文就可以了。
/// <summary>
/// 获取一级文件夹下的二级文件夹
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
folderBrowserDialog1.Description= "请选择文件路径";
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) {
string path = folderBrowserDialog1.SelectedPath;
getfj(path );
}
}
如果只是需要上传文件的话,可以考虑使用控件OpenFileDialog,或者做一个listView工具的拖动功能实现,下图中的listFmXFQXFQJPEG为listView控件如下代码所示:
private void listFmXFQXFQJPEG_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Link;
else e.Effect = DragDropEffects.None;
}
private void listFmXFQXFQJPEG_DragDrop(object sender, DragEventArgs e)
{
具体的上传操作
}