deno_stdにmultipartモジュールが実装された
つい昨日、deno_std(deno標準ライブラリ)にmultipartモジュールが実装された by keroxp.icon 2019/2/12 レビューは結構丁寧にやってもらったおかげでそれなりに固いコードができたと思う
のでmultipartモジュールの使い方と追加で入れた新しいAPIを紹介する
multipartモジュールには大きく2つのAPIがある
MultipartReaderとMultipartWriter
それぞれ、multipart/form-dataのreader/writerになっている
まずWriterから
code:ts
const buf = new Buffer();
const mw = new MultipartWriter(buf);
await mw.writeField("foo", "foo");
await mw.writeField("bar", "bar");
const f = await open(path.resolve("./sample.txt"), "r");
await mw.writeFile("file", "sample.txt", f);
await mw.close();
const contentType = mw.formContentType();
new MultipartWriter()でWriterを受け取って、multipartデータを書きこんでいく
文字列フィールドはwriteField()で、ファイルはwriteFile()で書き込めます
close()でmultipartのデータを締め
formContentType()でboundary入りのContent-Typeを取得
次にReader
code:ts
const reader = ...
const mr = new MultipartReader(
reader,
"--boundary"
);
const form = await mr.readForm(10 << 20);
const foo = form"foo" as string const file =form"file" as FormFile new MultipartReader()でReaderとboundaryを受け取って、readForm()で読み出し
readForm()の引数は、読み出し時の最大メモリ使用量。ファイルのデータサイズがこれを超えると、溢れた部分はtempfileに書き出される
formは{[key: string]: string | FormFileのオブジェクト
FormFileは単なるファイルのラッパー
go.icon < なんか見覚えあるゾ
ちなみにこの2つのクラスの実装はgoのmultipartモジュールのほぼ書き写し
仕事でgoでmultipartの読み出し書き出しをやって使いやすかったので
その他新規API紹介
StringReader/StringWriter //io/readers.ts, //io/writers.ts
ふたつととも文字列をReader/Writer化するためのラッパークラス
code:ts
const r = new StringReader("deno.land")
await copy(w, r)
地味に便利だと思います
Bufferでも同様の事ができるのだけど、こちらはPure TSで実装もすぐ見られます
MultiReader //io/readers.ts
これもgo.iconからの移植
複数のReaderをまとめて一つのReader化するもの
code:ts
const mr = new MultiReader(
new StringReader("deno.land")
)
const w = new StringWriter();
await copy(w, mr)
tempFile() //io/util.ts
一時ファイルを作るutility
code:ts
const {file, filepath} = await tempFile(".", {
prefix: "prefix-",
postfix: ".jpg"
})
ディレクトリとprefixとpostfixを指定して作成
copyN() //io/ioutil.ts)
これもgo.icon(ry
copy()のサイズ指定版。最大でnサイズのcopyをReader/Writer間で行います
code:ts
const w = new StringWriter();
const r = new StringReader("abcdefghij");
const n1 = await copyN(w, r, 5); // => 5
const n2 = await copyN(w, r, 5); // => 5
encoder, decoder, encode(), decode() //strings/strings.ts
TextEncoderとTextDecoderのショートハンド
もうconst encoder = new TextEncoderしなくていいぞ!
だいたいこんな感じです