C# ASP.NET MVC-当文件位于另一个站点时,如何返回文件结果?

C# ASP.NET MVC-当文件位于另一个站点时,如何返回文件结果?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在写url重定向器。现在我正在努力解决这个问题: 假设我有这个方法: public FileResult ImageRedirect(string url) 我把这个字符串作为输入传递:http://someurl.com/somedirectory/someimage.someExtension 现在,我希望我的方法从someurl下载该图像,并将其作为文件()返回。我该怎么做 使用类从远程url下载文件,然后使用Controller.file方法返回该文件。WebClient类中的方法

我正在写url重定向器。现在我正在努力解决这个问题:

假设我有这个方法:

public FileResult ImageRedirect(string url)
我把这个字符串作为输入传递:
http://someurl.com/somedirectory/someimage.someExtension

现在,我希望我的方法从
someurl
下载该图像,并将其作为
文件()返回。我该怎么做

使用类从远程url下载文件,然后使用
Controller.file
方法返回该文件。WebClient类中的方法将为您完成此任务

因此,您可以编写一个这样的操作方法,它接受文件名(文件的url)

所以你可以通过调用

yoursitename/yourController/GetImage?fileName="http://somesite.com/logo.png

由于您可能允许用户让您的服务器下载web上的任何文件,因此我认为您需要限制最大下载文件大小

为此,您可以使用以下代码:

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;
}
fileMaxKbSize表示允许的最大大小(kb)(默认值为1Mb)

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");
}