discord.pyでファイルを送信しようと思ったらこけた時のこと。
タイトルの通りdiscord.pyでbotを作っていた時にこけたので対処法を忘れんうちに書いとく。
まずこけたコードはこれ
from PIL import Image
import io
import discord
async def send_pic(message :discord.Message):
pic = Image.open("path")
# -----------
# 色々画像処理
# -----------
data = io.BytesIO() # バイトライクオブジェクト作成
pic.save(data,format="png") # 保存
file = discord.File(data) # discord.pyのFileクラスのインスタンスを生成
await message.channel.send(content="send pic",file=file) # 送信
PILで画像を読み込み処理してからBytesIOに保存して送信するコードだが、いざ走らせてみると送信自体はされるがデータが0Bの状態で送られてきていた。
原因
BytesIOのシークの位置がpic.save(data,format="png")の際に一番後ろになったままの状態でFileクラスに渡していたのが原因だった。
解決策
from PIL import Image
import io
import discord
async def send_pic(message :discord.Message):
pic = Image.open("path")
# -----------
# 色々画像処理
# -----------
data = io.BytesIO() # バイトライクオブジェクト作成
pic.save(data,format="png") # 保存
data.seek(0) # <- シーク位置を先頭に持ってきている。
file = discord.File(data) # discord.pyのFileクラスのインスタンスを生成
await message.channel.send(content="send pic",file=file) # 送信
data.seek(0)でシーク位置を先頭に持ってきている。
これで正しく中身のあるデータが送信されるようになった。
よくよく考えたらファイルを書き込んだときは最後のバイトを書き込んだ位置のままなのだから、先頭に戻してやらないと読み込んでもファイルの最後と認識してしまうじゃないか。<-早く気づけ
##参考
[io - Pythonドキュメント]
(https://docs.python.org/ja/3/library/io.html)
discord.py リファレンス