1

作業中の .NET アプリケーションでファイルをダウンロードできるように、マシンからブラウザにファイルを送信しようとしています。このSO 回答のコードを使用していますが、ローカル マシン上のファイルにアクセスしているため、HttpWebRequest を使用する代わりに FileWebRequest を使用しています。リクエストは次のよう FileWebRequest fileReq = (FileWebRequest)WebRequest.Create(@"file:///C:/Tmp/new.html");になります。URL をブラウザにコピーするとfile:///C:/Tmp/new.html、正しいファイルが表示されます。しかしfileReq.ContentLength、コードで使用すると常に が返さ0れるため、何らかの理由でファイルが読み取られていないと思われます。ここで何が起こっているのか誰か教えてもらえますか?

編集:これが私のコードです。他のSOの質問とまったく同じように言ったのですが、HttpWebRequestの代わりにFileWebRequestを使用しました。

        Stream stream = null;
        int bytesToRead = 10000;
        byte[] buffer = new Byte[bytesToRead];
        try
        {               
            FileWebRequest fileReq = (FileWebRequest)WebRequest.Create(@"file:///C:/Tmp/new.html");
            FileWebResponse fileResp = (FileWebResponse)fileReq.GetResponse();

            if (fileReq.ContentLength > 0)
            {
                fileResp.ContentLength = fileReq.ContentLength;
                stream = fileResp.GetResponseStream();
                var resp = HttpContext.Current.Response;
                resp.ContentType = "application/octet-stream";
                resp.AddHeader("Content-dsiposition", "attachment; filename=" + url);
                resp.AddHeader("Content-Length", fileResp.ContentLength.ToString());

                int length;
                do
                {
                    if (resp.IsClientConnected)
                    {
                        length = stream.Read(buffer, 0, bytesToRead);
                        resp.OutputStream.Write(buffer, 0, length);
                        resp.Flush();
                        buffer = new Byte[bytesToRead];
                    }
                    else
                    {
                        length = -1;
                    }
                } while (length > 0);
            }
        }
        catch (Exception ex)
        {
            FileLabel.Text = ex.Message.ToString();
        }
        finally
        {
            if (stream != null)
            {
                stream.Close();
            }
        }
4

2 に答える 2

0

WebClient クラスを試してください。

 public static void Main (string[] args)
{
    if (args == null || args.Length == 0)
    {
        throw new ApplicationException ("Specify the URI of the resource to retrieve.");
    }
    WebClient client = new WebClient ();

    // Add a user agent header in case the 
    // requested URI contains a query.

    client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

    Stream data = client.OpenRead (args[0]);
    StreamReader reader = new StreamReader (data);
    string s = reader.ReadToEnd ();
    Console.WriteLine (s);
    data.Close ();
    reader.Close ();

チュートリアルはこちら

于 2013-06-12T19:31:38.817 に答える