Javascript または Flash を使用してユーザー ファイルのハッシュ値を取得するにはどうすればよいですか?
-
22-08-2019 - |
質問
私がする必要があるのは、Web ページ上にファイル ブラウザ ボックスを提供し、ユーザーが自分のコンピュータからファイルを選択すると、JavaScript (または必要に応じて Flash) を通じて、CRC、MD5、SHA1 などの何らかのハッシュが返されることです。かなり大きなファイルが使用されることが予想されるため、ファイル全体を Web サーバーにアップロードする必要はないと考えています。
基本的に、これらの値をある種の META データに関連付けて、完全にアップロードしなくてもファイルを識別できるようにするスクリプトを作成しています。
これをどのようにすればよいか考えられますか?サーバー側でこれを行うのは簡単ですが、前述したように、いくつかのかなり大きなファイルがチェックされることになるため、サーバーの帯域幅をあまり消費したくありません。
解決
ユーザーが Flash Player 10 を持っている場合は、Flash を使用してこれを行うことができます。
がここにあります チュートリアル
他のヒント
このはの伝統的なのJavaScriptを使用可能ではないが、それができる場合は、<のhref = "http://www.w3.org/TR/file-upload/" のrel = "nofollowをnoreferrer "> W3ファイルこれまでにキャッチします。
のスペックをアップロードバリアントは、Firefox 3で利用可能です。
var content= input.files[0].getAsBinary();
他のブラウザの場合は、あなたがフラッシュおよび/またはサーバー側のハッシュにフォールバックする必要があります。
ここではあなたのためのSHA-1のボーナスJSの実装です。
function sha_hexdigest(bytes) {
var digest= sha_bytes(sha_calculate(sha_ints(bytes), bytes.length*8));
var digits= '0123456789abcdef';
var hex= '';
for (var i= 0; i<digest.length; i++) {
var c= digest.charCodeAt(i);
hex+= digits.charAt((c>>4)&0xF) + digits.charAt(c&0xF);
}
return hex;
}
function sha_ints(bytes) {
while (bytes.length%4!=0)
bytes+= '\x00';
var ints= new Array();
for (var i= 0; i<bytes.length; i+= 4) {
ints[ints.length]= (
(bytes.charCodeAt(i)&0xFF)<<24 | (bytes.charCodeAt(i+1)&0xFF)<<16 |
(bytes.charCodeAt(i+2)&0xFF)<<8 | (bytes.charCodeAt(i+3)&0xFF)
); }
return ints;
}
function sha_bytes(ints) {
var bytes= '';
for (var i= 0; i<ints.length; i++)
bytes+= String.fromCharCode((ints[i]>>24)&0xFF, (ints[i]>>16)&0xFF, (ints[i]>>8)&0xFF, ints[i]&0xFF)
return bytes;
}
function sha_calculate(ints, bitn) {
while (ints.length*32<=bitn) ints[ints.length]= 0;
ints[ints.length-1]|= 1<<(31-bitn%32)
while (ints.length%16!=14) ints[ints.length]= 0;
ints[ints.length]= Math.floor(bitn/0x100000000);
ints[ints.length]= bitn&0xFFFFFFFF;
var h0= 1732584193, h1= -271733879, h2= -1732584194, h3= 271733878, h4= -1009589776;
var a, b, c, d, e, f, k, temp, w= new Array(80);
for(var inti= 0; inti<ints.length; inti+= 16) {
a= h0; b= h1; c= h2; d= h3; e= h4;
for (var i= 0; i<16; i++) w[i]= ints[inti+i];
for (; i<80; i++) w[i]= sha_rol(w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16], 1);
for(var i= 0; i<80; i++) {
switch (Math.floor(i/20)) {
case 0: f= sha_add(1518500249, (b & c) | ((~b) & d)); break;
case 1: f= sha_add(1859775393, b ^ c ^ d); break;
case 2: f= sha_add(-1894007588, (b & c) | (b & d) | (c & d)); break;
case 3: f= sha_add(-899497514, b ^ c ^ d); break;
}
temp= sha_add( sha_add(sha_rol(a, 5), w[i]), sha_add(e, f) );
e= d; d= c; c= b; b= a; a= temp;
c= sha_rol(c, 30);
}
h0= sha_add(h0, a); h1= sha_add(h1, b); h2= sha_add(h2, c); h3= sha_add(h3, d); h4= sha_add(h4, e);
}
return new Array(h0, h1, h2, h3, h4);
}
function sha_add(a, b) {
var lsw= (a&0xFFFF) + (b&0xFFFF);
var msw= (a>>16) + (b>>16) + (lsw>>16);
return (msw<<16) | (lsw&0xFFFF);
}
function sha_rol(n, bits) {
return (n<<bits) | (n>>>(32-bits));
}
HTML5ファイルAPIを使用すると、ローカルコンピュータ内のファイルを読み込むことができ、私の解決策では良いを持っています: Javascriptをするで
このはJavascriptを持つことはできません。私は、これはSilverlightので行うことができます知っています。おそらく、フラッシュの経験を持つ誰かが答えることができます。
ブラウザ(すなわち、JavaScriptが)、期間をローカルファイルシステムにアクセスすることができません。彼らはことができれば、それはセキュリティ上の悪夢になります。