【发布时间】:2010-11-09 18:17:42
【问题描述】:
如何以编程方式保存来自 URL 的图像?我正在使用 C#,需要能够从 URL 中获取图像并将它们存储在本地。 ...不,我不是在偷东西 :)
【问题讨论】:
-
图片是网址还是网址中的图片引用?
-
特定图片的URL
如何以编程方式保存来自 URL 的图像?我正在使用 C#,需要能够从 URL 中获取图像并将它们存储在本地。 ...不,我不是在偷东西 :)
【问题讨论】:
我的解决方案是将图像预先保存到磁盘,然后作为普通保存的图像使用:
remoteFile = "http://xxx.yyy.com/image1.png"; localFile = "c:\myimage.png";
WebClient webClient = new WebClient(); webClient.DownloadFile(remoteFile, localFile);
【讨论】:
aspx (c#) 中的一个例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.IO;
public partial class download_file_from_url : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string url = "http://4rapiddev.com/wp-includes/images/logo.jpg";
string file_name = Server.MapPath(".") + "\\logo.jpg";
save_file_from_url(file_name, url);
Response.Write("The file has been saved at: " + file_name);
}
public void save_file_from_url(string file_name, string url)
{
byte[] content;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
using (BinaryReader br = new BinaryReader(stream))
{
content = br.ReadBytes(500000);
br.Close();
}
response.Close();
FileStream fs = new FileStream(file_name, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
try
{
bw.Write(content);
}
finally
{
fs.Close();
bw.Close();
}
}
}
作者:HOAN HUYNH
ASP.Net C# Download Or Save Image File From URL
这样写会更容易:
WebClient webClient = new WebClient();
webClient.DownloadFile(remoteFileUrl, localFileName);
【讨论】:
Dispose()
IDisposable 接口,因此应该被处理掉。但是也有WebClient(来自Silverlight)没有实现IDisposable接口,不能按照上面的方式处理。这个答案是关于 System.Net.WebClient 可能而且应该被处理的。
Dispose 意味着尽快释放对象(句柄/内存/其他)使用的资源。是的,对于托管对象,GC 会保存你的培根,但你不能确定确切的时间。至于我,明确地调用Dispose 或使用using 构造是一个经验法则。
Dispose() 并没有立即释放内存。
您只需使用 HttpWebRequest 为图像的 URI 发出基本的 http 请求,然后获取生成的字节流,然后将该流保存到文件中。
这是一个关于如何执行此操作的示例...
'作为旁注,如果图像非常大,您可能希望将 br.ReadBytes(500000) 分解为一个循环,并在写入每批字节时一次抓取 n 个字节找回它们。'
using System;
using System.IO;
using System.Net;
using System.Text;
namespace ImageDownloader
{
class Program
{
static void Main(string[] args)
{
string imageUrl = @"http://www.somedomain.com/image.jpg";
string saveLocation = @"C:\someImage.jpg";
byte[] imageBytes;
HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(imageUrl);
WebResponse imageResponse = imageRequest.GetResponse();
Stream responseStream = imageResponse.GetResponseStream();
using (BinaryReader br = new BinaryReader(responseStream ))
{
imageBytes = br.ReadBytes(500000);
br.Close();
}
responseStream.Close();
imageResponse.Close();
FileStream fs = new FileStream(saveLocation, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
try
{
bw.Write(imageBytes);
}
finally
{
fs.Close();
bw.Close();
}
}
}
}
【讨论】: