我正在编写 url 重定向器。现在我正在努力解决这个问题:
假设我有这个方法:
public FileResult ImageRedirect(string url)
我将此字符串作为输入传递:http://someurl.com/somedirectory/someimage.someExtension
.
现在,我希望我的方法从 下载该图像someurl
,并将其作为File()
. 我怎样才能做到这一点?
我正在编写 url 重定向器。现在我正在努力解决这个问题:
假设我有这个方法:
public FileResult ImageRedirect(string url)
我将此字符串作为输入传递:http://someurl.com/somedirectory/someimage.someExtension
.
现在,我希望我的方法从 下载该图像someurl
,并将其作为File()
. 我怎样才能做到这一点?
使用WebClient
class从远程url下载文件,然后使用Controller.File
方法返回。DownLoadData
WebClient 类中的方法将为您解决问题。
所以你可以写一个像这样的动作方法,它接受文件名(文件的url)
public ActionResult GetImage(string fileName)
{
if (!String.IsNullOrEmpty(fileName))
{
using (WebClient wc = new WebClient())
{
var byteArr= wc.DownloadData(fileName);
return File(byteArr, "image/png");
}
}
return Content("No file name provided");
}
所以你可以通过调用来执行这个
yoursitename/yourController/GetImage?fileName="http://somesite.com/logo.png
因为您可能允许用户让您的服务器下载网络上的任何文件,所以我认为您希望限制最大下载文件大小。
为此,您可以使用以下代码:
public static MemoryStream downloadFile(string url, Int64 fileMaxKbSize = 1024)
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url));
webRequest.Credentials = CredentialCache.DefaultCredentials;
webRequest.KeepAlive = true;
webRequest.Method = "GET";
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Int64 fileSize = webResponse.ContentLength;
if (fileSize < fileMaxKbSize * 1024)
{
// Download the file
Stream receiveStream = webResponse.GetResponseStream();
MemoryStream m = new MemoryStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = receiveStream.Read(buffer, 0, buffer.Length)) != 0 && bytesRead <= fileMaxKbSize * 1024)
{
m.Write(buffer, 0, bytesRead);
}
// Or using statement instead
m.Position = 0;
webResponse.Close();
return m;
}
return null;
}
catch (Exception ex)
{
// proper handling
}
return null;
}
在你的情况下,像这样使用:
public ActionResult GetImage(string fileName)
{
if (!String.IsNullOrEmpty(fileName))
{
return File(downloadFile(fileName, 2048), "image/png");
}
return Content("No file name provided");
}
fileMaxKbSize表示允许的最大大小,以 kb 为单位(默认为 1Mb)