Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8832

Node.js で Azure BLOB に SAS トークン を使って、ファイルをアップロードしてダウンロードする

$
0
0

tl;dr

SAS トークンの構造を学習するために、MSのライブラリを使わないで生成しました。

公式ドキュメント : サービス SAS を作成する

コード

ファイルをアップロードして、すぐさま、ダウンロードします。

以前のコードとの違いは、'permission' に 'c' を足したこと。
それ以外は同じで大丈夫みたい。

main.js
constaxios=require("axios");constSAS=require("./SAS");constfs=require("fs");constname="ストレージアカウント名";constkey="キー";constcontainer="コンテナ名";constblob="ブロブ名";constfilename="ファイル名";constexpiry=1;// 1 秒間有効constsas=newSAS(name,key);constget=async(blob,filename)=>{// URL 生成consturl=sas.getUrl(container,blob,expiry,filename);console.log(url);awaitaxios({method:"get",url,responseType:"arraybuffer",// axios}).then((result)=>{console.log(result.statusText);constname=result.headers["content-disposition"].split("=")[1].slice(1,-1);fs.writeFileSync(name,result.data);});};constput=async(blob,filename)=>{// URL 生成consturl=sas.getUrl(container,blob,expiry,filename);console.log(url);constdata=fs.readFileSync(filename);awaitaxios({method:"put",url,data,headers:{"Content-Type":"application/octet-stream","x-ms-blob-type":"BlockBlob",},}).catch((e)=>{console.log(e);});};constmain=async()=>{awaitput(blob,filename);awaitget(blob,filename+".1");};main().then((result)=>{console.log(result);});
SAS.js
constcrypto=require("crypto");classSAS{// コンストラクタ// @param name ストレージアカウント名// @param key ストレージアカウントキーconstructor(name,key){this.account_name=name;this.account_key=key;}// トークン付きURLを生成する// @param container コンテナ名// @param blob ブロブ名// @param expiry_second トークン有効期間// @param filename ファイル名getUrl(container,blob,expiry_second,filename){consttoken=this.getToken(container,blob,expiry_second,filename);consturl=`https://${this.account_name}.blob.core.windows.net/${container}/${blob}`;return`${url}?${token}`;}// トークンを生成する// @param container コンテナ名// @param blob ブロブ名// @param expiry_second トークン有効期間// @param filename ファイル名getToken(container,blob,expiry_second,filename){// パラメータconstnow=newDate();conststart="";// this.isoDate(now, start_second);constexpiry=this.isoDate(now,expiry_second);constversion="2018-11-09";constresource="b";constpermission="rc";constip="";// "0.0.0.0/0";constprotocol="";// "https";constcanonicalizedResource=`/blob/${this.account_name}/${container}/${blob}`;constrscc="";constrscd=`attachment; filename="${filename}"`;constrsce="";constrscl="";constrsct="";constidentifier="";constsnapshot="";// シグネチャ (順番は厳守)conststringToSign=[permission,start,expiry,canonicalizedResource,identifier,ip,protocol,version,resource,snapshot,rscc,// Cache-Controlrscd,// Content-Dispositionrsce,// Content-Encodingrscl,// Content-Languagersct,// Content-Type].join("\n");// HMAC256constsignature=this.getHMAC256(stringToSign);// クエリパラメータ (順番は任意)constsas=[["sp",permission],//["sr",resource],// ["st", start],["se",expiry],// ["sip", ip],// ["spr", protocol],["sv",version],["sig",signature],["rscd",rscd],].map(([k,v])=>`${k}=${encodeURIComponent(v)}`).join("&");returnsas;}isoDate(now,second=0){constdate=newDate(now.getTime()+second*1000);returndate.toISOString().substring(0,19)+"Z";}getHMAC256(input){// 1. キー は Buffer (Base64 で デコード)constkey=Buffer.from(this.account_key,"base64");consthmac=crypto.createHmac("sha256",key);// 2. 入力 は Buffer (UTF8 で デコード)constinp=Buffer.from(input,"utf8");// 3. 出力 は Buffer を Base64 で エンコードconstout=hmac.update(inp).digest();returnout.toString("base64");}// 上を簡単に書き直すとgetHMAC256_(input){constkey=Buffer.from(this.account_key,"base64");returncrypto.createHmac("sha256",key).update(input).digest("base64");}}module.exports=SAS;

Viewing all articles
Browse latest Browse all 8832

Trending Articles