web-dev-qa-db-ja.com

httpwebrequestを使用してWebサイトからローカルファイルに画像をプルする方法

ローカルc#アプリを使用して、Webサイトからいくつかの画像をローカルマシンのファイルにプルしようとしています。以下のコードを使用しています。 ASCIIエンコーディングとUTF8エンコーディングの両方を試しましたが、最終的なファイルは正しくありません。誰かが私が間違っていることを認識していますか?URLはアクティブで正しく、画像を正しく表示していますブラウザにアドレスを入力したとき。

    private void button1_Click(object sender, EventArgs e)
    {
        HttpWebRequest lxRequest = (HttpWebRequest)WebRequest.Create("http://www.productimageswebsite.com/images/stock_jpgs/34891.jpg");

        // returned values are returned as a stream, then read into a string
        String lsResponse = string.Empty;
        HttpWebResponse lxResponse = (HttpWebResponse)lxRequest.GetResponse();
        using (StreamReader lxResponseStream = new StreamReader(lxResponse.GetResponseStream()))
        {
            lsResponse = lxResponseStream.ReadToEnd();
            lxResponseStream.Close();
        }

        byte[] lnByte = System.Text.UTF8Encoding.UTF8.GetBytes(lsResponse);

        System.IO.FileStream lxFS = new FileStream("34891.jpg", FileMode.Create);
        lxFS.Write(lnByte, 0, lnByte.Length);
        lxFS.Close();

        MessageBox.Show("done");
    }
21
Steve Brownell

素敵な画像:D

次のコードを使用してみてください:

binaryReaderを使用する必要がありました。これは、画像ファイルがバイナリデータであるため、UTFまたはASCIIでエンコードされていないためです。

編集:使用する

HttpWebRequest lxRequest = (HttpWebRequest)WebRequest.Create(
"http://www.productimageswebsite.com/images/stock_jpgs/34891.jpg");

// returned values are returned as a stream, then read into a string
String lsResponse = string.Empty;
using (HttpWebResponse lxResponse = (HttpWebResponse)lxRequest.GetResponse()){
   using (BinaryReader reader = new BinaryReader(lxResponse.GetResponseStream())) {
      Byte[] lnByte = reader.ReadBytes(1 * 1024 * 1024 * 10);
      using (FileStream lxFS = new FileStream("34891.jpg", FileMode.Create)) {
          lxFS.Write(lnByte, 0, lnByte.Length);
      }
   }
}
MessageBox.Show("done");
31
Phil Rykoff

さて、これが最後の答えです。 reaponsestreamからのデータをバッファーする方法として、memorystreamを使用します。

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] lnBuffer;
        byte[] lnFile;

        HttpWebRequest lxRequest = (HttpWebRequest)WebRequest.Create("http://www.productimageswebsite.com/images/stock_jpgs/34891.jpg");
        using (HttpWebResponse lxResponse = (HttpWebResponse)lxRequest.GetResponse())
        {
            using (BinaryReader lxBR = new BinaryReader(lxResponse.GetResponseStream()))
            {
                using (MemoryStream lxMS = new MemoryStream())
                {
                    lnBuffer = lxBR.ReadBytes(1024);
                    while (lnBuffer.Length > 0)
                    {
                        lxMS.Write(lnBuffer, 0, lnBuffer.Length);
                        lnBuffer = lxBR.ReadBytes(1024);
                    }
                    lnFile = new byte[(int)lxMS.Length];
                    lxMS.Position = 0;
                    lxMS.Read(lnFile, 0, lnFile.Length);
                }
            }
        }

        using (System.IO.FileStream lxFS = new FileStream("34891.jpg", FileMode.Create))
        {
            lxFS.Write(lnFile, 0, lnFile.Length);
        }
        MessageBox.Show("done");
    }
15
Steve Brownell

asyncを使用した回答のバリエーションは、非同期ファイルI/Oを待機します非同期ファイルI/Oを参照 これが重要な理由.

Pngをダウンロードし、BinaryReader/Writerを使用してディスクに書き込む

string outFile = System.IO.Path.Combine(outDir, fileName);

// Download file
var request = (HttpWebRequest) WebRequest.Create(imageUrl);

using (var response = await request.GetResponseAsync()){
    using (var reader = new BinaryReader(response.GetResponseStream())) {

        // Read file 
        Byte[] bytes = async reader.ReadAllBytes();

        // Write to local folder 
        using (var fs = new FileStream(outFile, FileMode.Create)) {
            await fs.WriteAsync(bytes, 0, bytes.Length);
        }
    }
}

すべてのバイト拡張メソッドを読み取る

public static class Extensions {

    public static async Task<byte[]> ReadAllBytes(this BinaryReader reader)
    {
        const int bufferSize = 4096;
        using (var ms = new MemoryStream())
        {
            byte[] buffer = new byte[bufferSize];
            int count;
            while ((count = reader.Read(buffer, 0, buffer.Length)) != 0) {
                await ms.WriteAsync(buffer, 0, count);
            }
            return ms.ToArray();
        }
    }
}
3
Learner

次のメソッドを使用して、Webサイトから画像をダウンロードし、Imageクラスを使用して保存できます。

WebRequest req = WebRequest.Create(imageUrl);
WebResponse resp = req.GetResponse();
Image img = Image.FromStream(resp.GetResponseStream());
img.Save(filePath +  fileName + ".jpg");
0
Tarek.Mh