2

メンバーが写真をアップロードできるようにするサイトがあります。MVC コントローラーではFormCollection、アクションのパラメーターとして を取得します。次に、最初のファイルを type として読み取りますHttpPostedFileBase。これを使用してサムネイルを生成します。これはすべてうまくいきます。

メンバーが自分の写真をアップロードできるようにするだけでなく、 を使用してSystem.Net.WebClient自分で写真をインポートしたいと考えています。

アップロードされた写真 (ファイル) を処理するメソッドを一般化して、特定のHttpPostedFileBase.

にはファイルのストリームを含むプロパティがあり、HttpPostedFileBaseStreamを返すメソッドがあるため、すべてを Stream に基づいて作成しようとしています。InputStreamWebClientOpenRead

ただし、 Stream overを使用すると、ファイルの検証に使用するプロパティが失われHttpPostedFileBaseているように見えます。ContentTypeContentLength

以前にバイナリ ストリームを使用したことがありませんが、ストリームからContentTypeandを取得する方法はありContentLengthますか? HttpPostedFileBaseまたは、ストリームを使用してオブジェクトを作成する方法はありますか?

4

1 に答える 1

3

ストリームを処理する 1 つのメソッドを作成できるため、ストリームが発生する多くのシナリオを作成できるため、生ストリームの観点から見るのは正しいことです。

ファイル アップロードのシナリオでは、取得するストリームは content-type とは別のプロパティにあります。場合によっては、マジック ナンバー(こちらも優れたソース) を使用してストリーム ヘッダー バイトによってデータ型を検出できますが、データは他の手段 (つまり、Content-Type ヘッダーまたは . ext ファイル拡張子など)。

ストリームを読み取るだけでストリームのバイト長を測定できるため、実際には Content-Length ヘッダーは必要ありません。ブラウザーは、予想されるファイルのサイズを事前に知っておくと便利です。

WebClientがインターネット上のリソース URI にアクセスしている場合、http://www.example.com/imageのようなファイル拡張子を認識します。gifであり、これは適切なファイル タイプ識別子になる可能性があります。

ファイル情報は既に利用可能であるため、カスタム処理メソッドでもう 1 つの引数を開いて、次のようなコンテンツ タイプ文字列識別子を受け入れてみませんか。

public static class Custom {

     // Works with a stream from any source and a content type string indentifier.

     static public void SavePicture(Stream inStream, string contentIdentifer) {

        // Parse and recognize contentIdentifer to know the kind of file.
        // Read the bytes of the file in the stream (while counting them).
        // Write the bytes to wherever the destination is (e.g. disk)

        // Example:

        long totalBytesSeen = 0L;

        byte[] bytes = new byte[1024]; //1K buffer to store bytes.
        // Read one chunk of bytes at a time.

        do
        {
            int num = inStream.Read(bytes, 0, 1024); // read up to 1024 bytes

            // No bytes read means end of file.
            if (num == 0)
                break; // good bye

            totalBytesSeen += num;  //Actual length is accumulating.

            /* Can check for "magic number" here, while reading this stream
             * in the case the file extension or content-type cannot be trusted.
             */

            /* Write logic here to write the byte buffer to
             * disk or do what you want with them.
             */

        } while (true);

     } 

}

いくつかの便利なファイル名解析機能が IO 名前空間にあります:

using System.IO;

次のように、言及したシナリオでカスタムメソッドを使用します。

という名前のHttpPostedFileBaseインスタンスからmyPostedFile

 Custom.SavePicture(myPostedFile.InputStream, myPostedFile.ContentType);

という名前のWebClientインスタンスを使用する場合webClient1:

var imageFilename = "pic.gif";
var stream = webClient1.DownloadFile("http://www.example.com/images/", imageFilename)
//...
Custom.SavePicture(stream, Path.GetExtension(imageFilename));

または、ディスクからファイルを処理する場合でも:

Custom.SavePicture(File.Open(pathToFile), Path.GetExtension(pathToFile));

解析して認識できるコンテンツ識別子を使用して、ストリームに対して同じカスタム メソッドを呼び出します。

于 2010-11-14T06:10:15.623 に答える