//download file from url
//makesure destination folder exist before call this function
//input para example:
//http://g-ecx.images-amazon.com/images/G/01/kindle/dp/2012/KC/KC-slate-01-lg._V401028090_.jpg
//download\B007OZNZG0\KC-slate-01-lg._V401028090_.jpg
public bool downloadFile(string fileUrl, string fullnameToStore, out string errStr, Action<int> funcUpdateProgress)
{
bool downloadOk = false;
errStr = "未知错误!";
if ((fileUrl == null) || (fileUrl == ""))
{
errStr = "URL地址为空!";
return downloadOk;
}
if ((fullnameToStore == null) || (fullnameToStore == ""))
{
errStr = "文件保存路径为空!";
return downloadOk;
}
//const int maxFileLen = 100 * 1024 * 1024; // 100M
const int maxFileLen = 300 * 1024 * 1024; // 300M
const int lessMaxFileLen = 100 * 1024 * 1024; // 100M
Byte[] binDataBuf;
try
{
binDataBuf = new Byte[maxFileLen];
}
catch (Exception ex)
{
//if no enough memory, then try alloc less
binDataBuf = new Byte[lessMaxFileLen];
}
int respDataLen = getUrlRespStreamBytes(ref binDataBuf, fileUrl, null, null, 0, funcUpdateProgress);
if (respDataLen < 0)
{
errStr = "无法下载文件数据!";
return downloadOk;
}
if (saveBytesToFile(fullnameToStore, ref binDataBuf, respDataLen, out errStr))
{
downloadOk = true;
}
return downloadOk;
}
例 10.3. downloadFile 的使用范例
public void updateProgress(int percentage)
{
//pgbDownload.Value = percentage;
}
public void downloadPictures(string productUrl, string respHtml, out string[] picFullnameList)
{
//......
string[] imageUrlList = amazonLib.extractProductImageList(respHtml);
gLogger.Info("Extracted image url list:");
if (imageUrlList != null)
{
picFullnameList = new string[imageUrlList.Length];
for (int idx = 0; idx < imageUrlList.Length; idx++)
{
string imageUrl = imageUrlList[idx];
gLogger.Info(String.Format("[{0}]={1}", idx, imageUrl));
string picFilename = crl.extractFilenameFromUrl(imageUrl);
string picFullFilename = Path.Combine(picFolderFullPath, picFilename);
string errorStr = "";
gLogger.Info(String.Format("Downloading {0} to {1}", imageUrl, picFullFilename));
crl.downloadFile(imageUrl, picFullFilename, out errorStr, updateProgress);