mamoe / mirai

高效率 QQ 机器人支持库
https://mirai.mamoe.net
GNU Affero General Public License v3.0
14.38k stars 2.53k forks source link

inputStream.toExternalImage 出现 No such file or directory 错误。 #675

Closed IceCream-QAQ closed 3 years ago

IceCream-QAQ commented 3 years ago

使用 mirai 提供的 InputStream 的扩展方法 toExternalImage,上传图片,出现 No such file or directory 异常。 环境:macOS 10.15.5 Java:1.8.0_221 Kotlin:1.4.10

收到部分反馈,Windows 上也有该异常出现,但不确定是否能稳定复现。

java.lang.IllegalStateException: cannot upload group image, failed on all servers.
    at net.mamoe.mirai.qqandroid.network.highway.HighwayHelper.uploadImageToServers(HighwayHelper.kt:104)
    at net.mamoe.mirai.qqandroid.network.highway.HighwayHelper$uploadImageToServers$2.invokeSuspend(HighwayHelper.kt)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.internal.ScopeCoroutine.afterResume(Scopes.kt:32)
    at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:113)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
    at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)
    at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:84)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
    at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)
    at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
    at com.icecreamqaq.yuq.mirai.message.ImageSend.toLocal(items.kt:61)
    at com.icecreamqaq.yuq.mirai.message.MiraiMessageKt.toLocal(MiraiMessage.kt:22)
    at com.icecreamqaq.yuq.mirai.entity.ContactImpl$sendMessage$m$1.invokeSuspend(mirai.kt:32)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
    at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)
    at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:84)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
    at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)
    at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
    at com.icecreamqaq.yuq.mirai.entity.ContactImpl.sendMessage(mirai.kt:31)
    at com.icecreamqaq.yuq.mirai.entity.ContactImpl.sendMessage(mirai.kt:21)
    at com.icecreamqaq.yuq.RainBot.todo(RainBot.kt:89)
    at com.icecreamqaq.yuq.RainBot.receiveGroupMessage(RainBot.kt:71)
    at com.icecreamqaq.yuq.mirai.MiraiBot$startBot$3.invokeSuspend(MiraiBot.kt:360)
    at com.icecreamqaq.yuq.mirai.MiraiBot$startBot$3.invoke(MiraiBot.kt)
    at net.mamoe.mirai.event.SubscriberKt__SubscriberKt$subscribeAlways$1.invokeSuspend(subscriber.kt:271)
    at net.mamoe.mirai.event.SubscriberKt__SubscriberKt$subscribeAlways$1.invoke(subscriber.kt)
    at net.mamoe.mirai.event.internal.Handler$onEvent$2.invokeSuspend(InternalEventListeners.kt:89)
    at net.mamoe.mirai.event.internal.Handler$onEvent$2.invoke(InternalEventListeners.kt)
    at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:91)
    at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:160)
    at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
    at net.mamoe.mirai.event.internal.Handler.onEvent(InternalEventListeners.kt:89)
    at net.mamoe.mirai.event.EventKt.broadcast(Event.kt:248)
    at net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler.handlePacket(QQAndroidBotNetworkHandler.kt:520)
    at net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler$generifiedParsePacket$2.invokeSuspend(QQAndroidBotNetworkHandler.kt:476)
    at net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler$generifiedParsePacket$2.invoke(QQAndroidBotNetworkHandler.kt)
    at net.mamoe.mirai.qqandroid.network.protocol.packet.KnownPacketFactories.handleIncomingPacket$mirai_core_qqandroid(PacketFactory.kt:279)
    at net.mamoe.mirai.qqandroid.network.protocol.packet.KnownPacketFactories.parseIncomingPacket(PacketFactory.kt:235)
    at net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler.generifiedParsePacket(QQAndroidBotNetworkHandler.kt:467)
    at net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler.parsePacket(QQAndroidBotNetworkHandler.kt:462)
    at net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler$parsePacketAsync$1.invokeSuspend(QQAndroidBotNetworkHandler.kt:445)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
Caused by: java.io.FileNotFoundException: /var/folders/gg/mg4yv45x6vs2m0tppl7mkgrr0000gn/T/tmp7047794578519269772.tmp (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at net.mamoe.mirai.utils.internal.AsReusableInput_jvmKt$asReusableInput$2.chunkedFlow(asReusableInput.jvm.kt:60)
    at net.mamoe.mirai.utils.internal.DeferredReusableInput.chunkedFlow(DeferredReusableInput.jvm.kt:50)
    at net.mamoe.mirai.qqandroid.network.highway.HighwayKt.createImageDataPacketSequence(highway.kt:45)
    at net.mamoe.mirai.qqandroid.network.highway.HighwayKt.createImageDataPacketSequence$default(highway.kt:40)
    at net.mamoe.mirai.qqandroid.network.highway.HighwayHelper.uploadImage$mirai_core_qqandroid(HighwayHelper.kt:153)
    at net.mamoe.mirai.qqandroid.network.highway.HighwayHelper$uploadImage$1.invokeSuspend(HighwayHelper.kt)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    ... 47 common frames omitted

复现

版本

mirai: 1.3.3

Him188 commented 3 years ago

input stream 默认往临时文件写入,可能是临时文件相关问题。

可以手动写入一个缓存文件后再使用 File.toExternalImage()

Karlatemp commented 3 years ago

原因是因为mirai进行资源释放的时机不正确