私のウェブアプリケーションでユーザーがアップロードした画像のバイト配列からmd5文字列を作成しようとしています。 これは画像を別のフォルダに広げたいからです。 そして、私はフォルダ名としてuserIDを使用する必要はありません。よりプロフェッショナルに見えます。アップロードされた画像のmd5ハッシュを作成する
結果は次のようなものになるだろう:
/images/ 'first-two-char-of-md5'/'the-complete-md5-string'.[jpg,png,bmp....]
は、画像を処理するための良い解決策として、この音をしていますか?
So. 私のコード(インターネットからのスタッフ。):
protected void btnUpload_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
if (CheckFileType(FileUpload1.FileName))
{
const int BUFFER_SIZE = 255;
Byte[] Buffer = new Byte[BUFFER_SIZE];
Stream theStream = FileUpload1.PostedFile.InputStream;
nBytesRead = theStream.Read(Buffer, 0, BUFFER_SIZE);
System.Text.ASCIIEncoding ASCIIEncoding = new ASCIIEncoding();
System.Text.UTF8Encoding utf8 = new UTF8Encoding();
//Just trying some stuff to see the output...
Label1.Text = ASCIIEncoding.GetString(CalculateMD5(theStream)) + "<br>" + utf8.GetString(CalculateMD5(theStream)) + "<br>" + Convert.ToBase64String(CalculateMD5(theStream));
}
}
}
private static byte[] _emptyBuffer = new byte[0];
public static byte[] CalculateMD5(Stream stream)
{
return CalculateMD5(stream, 64 * 1024);
}
public static byte[] CalculateMD5(Stream stream, int bufferSize)
{
MD5 md5Hasher = MD5.Create();
byte[] buffer = new byte[bufferSize];
int readBytes;
while ((readBytes = stream.Read(buffer, 0, bufferSize)) > 0)
{
md5Hasher.TransformBlock(buffer, 0, readBytes, buffer, 0);
}
md5Hasher.TransformFinalBlock(_emptyBuffer, 0, 0);
return md5Hasher.Hash;
}
結果。私は "calculateMD5()"からいくつかの出力を得るが、私はlabel1に配置しようとしているとき。何が起こっているかを見る。奇妙なキャラクターの束だけがあります。 ここで何が間違っていますか? htmlsafe ... a-z、A-Z、0-9のみにしたい。
ありがとうございます!同じイメージを持つ2人のユーザーについて私の場合は空である(私が思う)_emptybuffer byte []にuserIDを追加して、塩を追加することは可能だと思いますか? – Easyrider
はい、うまくいくはずです。 MD5はチェックサムを使用して最終ハッシュを計算します。「TransformFinalBlock」は、ここではデータの最後であり、ハッシュ演算を終了すると言っています。または、あなたは 'CalculateMD5'に渡すストリームの最後に追加のデータを書き込むことができます(最初にイメージデータを中間の' MemoryStream'に読み込み、余分なデータを追加し、 'MemoryStream'を' CalculateMD5'に渡すこともできます) )。 – mdm