不知道该怎么上传图片用于以后使用
-
mirai-consle用户,kotlin语言,不知道怎么上传图片然后用于下次使用,手动selectmessage和nextmessage然后获取图片并保存图片ID不行,翻遍了开发文档也没看到合适的方法,求教一下大佬们该怎么做哇
-
-
@tsudzuki 唔!谢谢大佬!我之前一直在image.kt里边找哈哈哈
-
@tsudzuki 唔,我发现还是不行啊大佬,我删掉了重来吧...就从这里开始,我应该怎么构建和发送图片呢?烦请大佬耐心指点一下,不胜感激!!
-
@lhqm 你不是说想上传图片么?你是想转发图片,还是想下载图片,还是想保存图片信息
还有,时间单位是millsecond,1000 millseconds = 1sec
-
@tsudzuki 嗯嗯!感谢大佬的纠正和回复!最近两天我又摸索了一下,大概就是以下问题:我选择下载图片然后发送,但是有几个问题:
1.基于Android平台开发的mirai-console插件,通过okhttp下载的图片,我应该如何来写图片的相对路径,来保证读写的正常实现?图片的相对路径会存到哪(试了但是失败了,没产生文件,我不知道该怎么搞)
2.IO流读写文件不能直接从主线程调用,只能创建新的线程,那么我应该怎样创建线程来调用,是方法体内写新线程直接用还是把线程写到另一个方法里来调用下载方法?
3.如何在固定一个时间,删除有些图片?有些图片是下载下来但是不会再用的,有些是一直循环利用的,那么我会把他们分开存放,就是如何清除不会再次利用的图片呢?
4.Android平台下的插件,频道内调用logger.info等方法,控制台不会有任何输出,我想在它下载图片或者有事件请求下载图片的时候在控制台告诉我一声(因为不想让机器人定向一个friend对象老是发消息给我,这个不知道大佬有没有好的解决方案)
以上就是我大概的疑点了,麻烦大佬指教了,谢谢大佬😙 -
1.你可以将图片保存到
PluginMain.dataFolder
2.在kotlin,你应该使用协程处理IO流runInterrcepted(Dispatchers.IO) { // code }
3.固定时间你可以使用Java内置的
TimerTask
或者寻找一些定时任务库(如Quartz
),当然你也可以选择自己手动管理,使用while和delay循环
4.logger.info应当是有效的,不过我也没测试过Android -
@tsudzuki 再次谢谢大佬的建议!不过这个相对路径应该怎么去写呢?协程的话我先自己去看看kotlin的协程吧!另外的话……Android的那个logger,我之前写在频道里测试,打印每一次别人说的话。就是只要有人在群里说话,他就会触发群频道嘛,但是logger没有任何输出……,只有在onenable的频道外边才有用……☹️
-
@lhqm logger是Plugin的logger么
-
@tsudzuki 就是直接调用的logger.info(),唔,我用手机回的,传不上来图片,频道外边用这个方法都行,放频道里就没用了,给开发和管理增加了不小的难度🙃
-
@lhqm 那你到时候让我看看就行
-
@tsudzuki 嗯嗯!大佬我先睡了,明天用电脑了再发上来吧,感谢大佬了哈,大佬好梦哟~
-
@tsudzuki 大佬大佬,下载图片是这么写嘛?另外还烦请大佬告诉一下存储的相对路径应该是怎么样的
频道内的执行过程if (msg=="#添加图片"){ //判断添加请求的发起者是否属于管理员 if (primer==sender.id ){ //TODO:操作员先输入描述和图片 subject.sendMessage("请在50分钟内发送图片名称") val fileName=nextMessage(3000_000).filterIsInstance<PlainText>()[0].content subject.sendMessage("请在50分钟内发送图片") val image=nextMessage(3000_000).filterIsInstance<Image>()[0] subject.sendMessage("图片正在处理") //TODO:下载图片 downLoadImage(image.queryUrl(),fileName) }else{ subject.sendMessage("您无权进行此操作") } }
下载类的执行过程
fun downLoadImageByUrl(url:String,fileName:String){ //通过url的字符串强行转为URL,然后获取到InputStream val str= URL(url) val uc=str.openConnection() val input=uc.getInputStream() //向输出文件写入名字和路径,然后写入字节流 val output= FileOutputStream(fileName) var j=0 j=input.read() while (j!=-1){ output.write(j); j=input.read() } input.close() output.close() } fun downLoadImage(url: String,fileName: String){ //开启一个协程来执行下载 GlobalScope.launch (context = Dispatchers.IO){ downLoadImageByUrl(url,fileName) } }
还有喔,那个logger我是这么写的,反正写在频道内,Android的控制台是没有任何输出的,我不知道是我写的有错还是Android有bug,我导的包是
net.mamoe.mirai.utils.info
-
@lhqm filename内容是什么,还有你其实可以直接使用input.copyTo(output)
logger你可以在enavle的时候打印一下,看看有没有输出
-
@tsudzuki filename是用户传入的文件名字,我现在只是测试,所以说让用户自己传名字。之后我考虑再写个函数,直接把图片的mirai码里边那个ID切出来当名字。
-
@tsudzuki 唔,大佬,那这个图片的默认保存路径是哪里呀?
-
@lhqm 默认就是执行程序的环境根目录
你可以使用dataFolder得到console提供的插件数据目录
-
@tsudzuki 嗷嗷,我记得这个方法,谢谢大佬!
-
@tsudzuki 那么意思是这样写就是可以了的对吧?那个协程我发现我有点看不懂教程……我还是对线程熟悉一些,唔,协程那个没有问题吧?
-
@lhqm 线程也没问题,但是你用上kotlin了就最好用协程