4

私はASP.netを初めて使用し、期限切れのリンクを使用して外部ドメイン(Amazon S3)から写真をロードし、OpenBinaryメソッドを使用する別のスクリプトがピックアップするためにブラウザメモリに写真を保存するのがどれほど簡単か疑問に思いました. ? これにより、画面に印刷する前にサイズを変更して透かしを入れることができます。

これが私がしたいことです:

loadImage.aspx で、DB から photoID を取得し、Amazon S3 の期限切れの署名付き URL を作成し、何らかの方法で写真を呼び出してメモリに保存します。メモリ内にある場合、ASP.Jpeg スクリプトは OpenBinary メソッドを呼び出し、写真のサイズを変更して透かしを入れ、SendBinary メソッドを使用して写真を表示します。

メモリ ストリームまたは応答バイナリ書き込みはおそらく探しているものだと思いますが、外部の写真ソースでそれを使用する方法がわかりません。これは私がこれまで管理してきたものですが、混乱して、外部ドメインの写真をメモリにロードできれば、何か重要なものが欠けている場合は、これが機能するかどうかわからないので、助けが得られると思いました.. ..

私の画像要素:

<img src="loadImage.aspx?p=234dfsdfw5234234">

loadImage.aspx:

string AWS_filePath = "http://amazon............"

using (FileStream fileStream = File.OpenRead(AWS_filePath))
{
    MemoryStream memStream = new MemoryStream();
    memStream.SetLength(fileStream.Length);
    fileStream.Read(memStream.GetBuffer(), 0, (int)fileStream.Length);
}

// Persits ASP.Jpeg Component

objJpeg.OpenBinary( ... );
// resize bits
// watermark bits
objJpeg.SendBinary( ... );

どんな助けでも素晴らしいでしょう。

4

1 に答える 1

5

まず.ashx、ページ全体ではなくハンドラーの使用を開始し.aspxます。ハンドラーは aspx ページのすべての呼び出しを持っていませんでした。送信する内容がより明確になり、準備ができている既存のヘッダーをすべて回避します。

<img src="loadImage.ashx?p=234dfsdfw5234234">

画像のダウンロード方法。

string url = "http://amazon............"
byte[] imageData;
using (WebClient client = new WebClient()) {
   imageData = client.DownloadData(url);
}

ブラウザに画像を送る方法

// this is the start call from the handler
public void ProcessRequest(HttpContext context)
{
    // imageData is the byte we have read from previous
    context.Response.OutputStream.Write(imageData, 0, imageData.Length);
}

キャッシュとヘッダーの設定方法

    public void ProcessRequest(HttpContext context)
    {
      // this is a header that you can get when you read the image
      context.Response.ContentType = "image/jpeg";
      // the size of the image
      context.Response.AddHeader("Content-Length", imageData.Length.ToString());
      // cache the image - 24h example
  context.Response.Cache.SetExpires(DateTime.Now.AddHours(24));
      context.Response.Cache.SetMaxAge(new TimeSpan(24, 0, 0));
      // render direct
      context.Response.BufferOutput = false;

    ...
    }

このヒントがあなたの前進に役立つことを願っています。

相対:
https://stackoverflow.com/search?q=%5Basp.net%5D+DownloadData

于 2012-07-21T09:24:55.840 に答える