3

私はURLリダイレクターを書いています。今、私はこれに苦労しています:

私がこの方法を持っているとしましょう:

public FileResult ImageRedirect(string url)

そして、この文字列を入力として渡しますhttp://someurl.com/somedirectory/someimage.someExtension

今、私は私のメソッドがからその画像をダウンロードしsomeurl、それをとして返すようにしたいですFile()。これどうやってするの?

4

2 に答える 2

10

クラスを使用WebClientしてリモートURLからファイルをダウンロードし、Controller.Fileメソッドを使用してファイルを返します。DownLoadDataWebClientクラスのメソッドがあなたに代わってトリックを行います。

したがって、fileName(ファイルへの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
于 2013-03-21T12:52:26.770 に答える
1

ユーザーがサーバーに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;
}

そしてあなたの場合、このように使用するには:

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)

于 2017-01-12T14:16:18.470 に答える