ストリームを処理する 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));
解析して認識できるコンテンツ識別子を使用して、ストリームに対して同じカスタム メソッドを呼び出します。