回答編集履歴

1

コメントに対する追記

2019/05/22 08:35

投稿

sansaisoba
sansaisoba

スコア241

test CHANGED
@@ -19,3 +19,69 @@
19
19
  [https://line.github.io/line-bot-sdk-nodejs/api-reference/client.html#methods](https://line.github.io/line-bot-sdk-nodejs/api-reference/client.html#methods)
20
20
 
21
21
  `client.getMessageContent()`に、`event.message.id`を指定することで`readable stream`が取得できますので、それを元に画像の書き込みを行うと良いでしょう。
22
+
23
+
24
+
25
+ 追記
26
+
27
+ ---
28
+
29
+
30
+
31
+ [getMessageContent()](https://line.github.io/line-bot-sdk-nodejs/api-reference/client.html#methods) のマニュアルにもある通り、
32
+
33
+
34
+
35
+ > Please beware that what it returns is promise of readable stream. You can pipe the stream into a file, an HTTP response, etc.
36
+
37
+
38
+
39
+ `getMessageContent()`のcallbackで返ってくるのは[readable stream](https://nodejs.org/dist/latest/docs/api/stream.html#stream_readable_streams)です
40
+
41
+
42
+
43
+ ある程度の大きさの画像の場合、`stream.on('data')`は、chunkに分けられて複数回呼び出されます。
44
+
45
+ ```javascript
46
+
47
+ stream.on('data', (chunk) => {
48
+
49
+ console.log(`Received ${chunk.length} bytes of data.`);
50
+
51
+ });
52
+
53
+ ```
54
+
55
+ のようにして見れば、何度も呼び出されているのがわかると思います。
56
+
57
+
58
+
59
+ > コードを変えても0バイトの画像が出力されます。
60
+
61
+
62
+
63
+ 何度も呼び出されますので、最後に呼び出されたものしか書き込まれていないのでしょう。
64
+
65
+ (なので、正確には0バイトではなく数バイトにはなってると思いますが壊れた画像になっているはずです。)
66
+
67
+
68
+
69
+ [Node.js Stream を使いこなす - Qiita](https://qiita.com/masakura/items/5683e8e3e655bfda6756)
70
+
71
+
72
+
73
+ こちらを参考に、`fs.writeFile()`を使うのではなく、`fs.createWriteStream()`で作成したWriteable Streamにpipeしてやれば動作するはずです。
74
+
75
+
76
+
77
+ ```javascript
78
+
79
+ const dest = fs.createWriteStream('./out/test.jpg', 'binary');
80
+
81
+ client.getMessageContent(event.message.id).then(stream => {
82
+
83
+ stream.pipe(dest);
84
+
85
+ })
86
+
87
+ ```