图片的批量下载大概分为三步:
一、循环下载网络图片到服务器。
二、将图片文件夹压缩,并且删除下载的图片。
三、浏览器端使用JavaScript将图片另存为。
下面是后台.net core代码。
1、先将上一次的zip包进行删除,创建服务器存放图片的文件夹目录。
2、轮询图片信息,将图片一张张的下载到创建的文件夹目录中。
3、图片下载完成将文件夹进行压缩,删除之前创建的文件夹目录(这样就I可以把刚刚下载的图片也删除掉)。
//PicTable用于存放需要保存的网络图片地址和本地的文件夹名称
private string OnPostDownLoadAsync(DataTable PicTable)
{
string returnresult = "{\"code\":\"0\",\"data\":\"\"}";
try
{
WebClient mywebclient = new WebClient();
//获取网站当前根目录我用replace替换了一下为了防止传到js会转译出错
string sWebRootFolder = AppDomain.CurrentDomain.BaseDirectory.Replace("\\","/");
string folderpath = "WebResources/picturezip/";
string storecode = "";
if (PicTable.Rows.Count>0)
{//我们项目是根据每个登陆的人员编号创建的文件夹,防止同一时间一起下载图片导致错误
storecode = PicTable.Rows[0]["folder"].ToString();//图片保存的文件夹
string pdpath = sWebRootFolder + folderpath + storecode+ ".zip";
//保存图片路径
var savePath = string.Format("{0}{1}/", folderpath, storecode);
if (System.IO.File.Exists(pdpath))
{//存在压缩包就删除
System.IO.File.Delete(pdpath);
}
if (!Directory.Exists(sWebRootFolder+savePath))
{//没有文件夹进行创建
Directory.CreateDirectory(sWebRootFolder + savePath);
}
}
foreach (DataRow dr in PicTable.Rows)
{
string picpath = dr["OTCPIC"].ToString();
string url = picpath;
//保存图片路径
var savePath = string.Format("{0}{1}/", folderpath, storecode);
//文件名
string filename = System.IO.Path.GetFileName(url);
//扩展名
string extension = System.IO.Path.GetExtension(url);
savePath = sWebRootFolder + savePath;
//下载文件
mywebclient.DownloadFile(url, savePath + filename);
}
if (!string.IsNullOrEmpty(storecode))
{
string zippath = sWebRootFolder + folderpath+ storecode;
ZipFile.CreateFromDirectory(zippath , zippath + ".zip");
string returnpath = "/" + folderpath + storecode + ".zip";
returnresult = "{\"code\":\"0\",\"data\":\""+ returnpath + "\"}";
if (Directory.Exists(zippath))
{//删除下载的图片
Directory.Delete(zippath,true);
}
}
else
{
returnresult = "{\"code\":\"1001\",\"data\":\"图片信息数据不能为空\"}";
}
}
catch (Exception ex)
{
returnresult = "{\"code\":\"1002\",\"data\":\""+ ex.Message.Replace("\"", "") + "\"}";
}
return returnresult;
}
我们项目是根据每个登陆用户下载的图片不一样,所以每个账户在下载时候都创建了一个属于自己的文件夹,将图片下载到该文件夹下,然后将文件夹打包成压缩包。最后将创建的文件夹删除掉(也就是将刚刚下载的图片删除掉),并且将压缩包地址放回到浏览器端。
下面是浏览器端javascript代码,先判断了一下是不是图片下载成功。如果下载成功就下载图片压缩包。
function picdowload(data){
var dataobj=eval("("+data+")");
if(dataobj["code"]=="0"){
var urlhref = window.location.href;
var urlhost = window.location.host;
var url = urlhref.split(":")[0] + "://" + urlhost + dataobj["data"];
window.open(url);
const iframe = document.createElement("iframe");
iframe.style.display = "none"; //防止影响页面
iframe.style.height = 0; //防止影响页面
iframe.src = url;
document.body.appendChild(iframe); //这一行必须,iframe挂在到dom树上才会发请求
}else{
alert(dataobj["data"]);
}
}
在这里使用的iframe标签进行的图片下载。
在批量下载中用到了一个ZipFile类,该类的API说明地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.io.compression.zipfile?view=netcore-3.1
我们项目中需要一个批量下载图片的功能。这就是我设计的图片下载的流程以及我的代码。也希望各位能够提出宝贵的意见和自己的见解。