游戏社区App (六):文章编辑与上传

2023-11-08

一、文章编辑-Android端

示例:
在这里插入图片描述
1、富文本编辑器
富文本编辑器参考的是GitHub上RichEditotAndroid的富文本编辑器
实现方式为使用 WebView + JavaScript。
原理为使用WebView来显示一个本地HTML。
1)、需要先在assets里放置静态网页和需要的初始化css。其中editor.html 为静态网页,editor.js为Android通过js与html相互调用的方法。
2)、RichEditor.java 作为富文本的实现类。

2、对RichEditotAndroid富文本编辑器进行修改
1、RichEditotAndroid编辑时,插入的图片为原图大小,对于浏览图片很不友好。需要修改图片,让其大小适应屏幕。
修改rich_editor.js中insertImage方法,为插入的图片新增style。
示例:

RE.insertImage = function(url, alt,style) {
    var html = '<img src="' + url + '" alt="' + alt + '" style="' + style + '" />
</br>';
    RE.insertHTML(html);
    RE.editor.scrollIntoView(false)
}

修改RichEditor.java中insertImage方法,传入对应的style。

String alt = "picvision";
String style = "margin-top:10px;max-width:100%;";
mEditor.insertImage(url,alt,style);

public void insertImage(String url, String alt, String style) {
    exec("javascript:RE.prepareInsert();");
    exec("javascript:RE.insertImage('" + url + "', '" + alt + "', '" + style + "');");
}

2、因为工程使用 Fragmentation 和 ButterKnife ,所以要对RichEditotAndroid进行相应的修改。

3、需要为RichEditotAndroid增加打开相册选择图片的功能。

2、富文本中的图片
1)、打开相册选择图片返回uri,把uri转换为File
示例代码:

public File uriToFile(Uri uri){
    File file = null;
    try {
        String[] arr = {MediaStore.Images.Media.DATA};
        Cursor cursor = mLatte.getProxyActivity().managedQuery(uri, arr, null, null, null);
        int img_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String img_path = cursor.getString(img_index);
        file = new File(img_path);
    } catch (Exception e){
        LocalLogUtils.e("e ="+e,true);
    }
    return file;
}

2)、使用的Retrofit封装中的upload进行图片的上传,后台保存图片并返回图片的url。最后富文本通过insertImage插入图片。

public void UpPhoto(File file){
    RestClient.builder()
            .url(API_UP_PHOTO)
            .file(file)
            .success(new ISuccess() {
                @Override
                public void onSuccess(String response) {
                    onUpPhotoListener.onSuccess(response);
                }
            })
            .failure(new IFailure() {
                @Override
                public void onFailure(String msg) {
                    LocalLogUtils.e("msg="+msg,true);
                    onUpPhotoListener.onFailure(msg);
                }
            })
            .error(new IError() {
                @Override
                public void onError(int code, String msg) {
                    LocalLogUtils.e("code="+code+"  msg="+msg,true);
                    onUpPhotoListener.onError(code,msg);
                }
            })
            .build()
            .upload();
}

3、上传文章
1)、获取发布的范围和封面图,并插入对应的文章样式。把html上传后台。
文章上传后台,示例代码:

private void initTop(){
            RestClient.builder() 
                    .url(AppInfo.API_UP_NEW_ARTICLE)
                    .params("bigType",bigType)
                    .params("smallType",smallType)
                    .params("coverPhotoUrl",coverPhotoUrl)
                    .params("title",title)
                    .params("articleContent",htmlData)
                    .params("author",author)
                    .success(new ISuccess() {
                        @Override
                        public void onSuccess(String response) {
                            LocalLogUtils.d("response="+response,false);
                            final JSONObject dataObject =JSONObject.parseObject(response);
                            int code = dataObject.getInteger("code");
                            if(code==300){
                                Tips.ToastLong("成功");
                                startWithPop(new EcBottomDelegate());//返回主界面
                            }else {
                                Tips.ToastLong("失败");
                                LocalLogUtils.d("上传文章失败,错误码:"+code,true);
                            }
                        }
                    })
                    .failure(new IFailure() {
                        @Override
                        public void onFailure(String msg) {
                            LocalLogUtils.d("msg="+msg,false);
                        }
                    })
                    .error(new IError() {
                        @Override
                        public void onError(int code, String msg) {
                            LocalLogUtils.d("code="+code+"  msg="+msg,false);
                        }
                    })
                    .build()
                    .post();
            }

二、Spring Boot后端
利用Spring Boot为Android App搭建一个简易的后台中新增上传图片的接口。
示例代码:
把上传的image图片保存到服务器,并返回图片的url

@RequestMapping("/up_photo")
public ApiResult upPhoto(@RequestParam("file") MultipartFile image){
    int code = 0;
    String status = "unknown error";
    String data = "";
    try {
        String fileName =saveFile(image); //保存图片
        String photoUrl = generateFileUrl(SON_PATH + fileName);//生成图片url
        data=photoUrl;
        code = ApiCallback.Success;
        status = "Save file success";
    }catch (Exception e){
        //报错了,返回错误信息
        status=String.valueOf(e);
    }
    //返回对应数据
    ApiResult apiResult = new ApiResult();
    apiResult.setCode(code);
    apiResult.setStatus(status);
    apiResult.setData(data);
    return apiResult;
}

把image图片保存到服务器。会在服务器的filePath文件夹生成对应的图片文件
示例代码:

在这里插入代码片private String saveFile(MultipartFile image){
    //图片存储的位置
    String filePath =ROOT_PATH+SON_PATH;//存储根目录+图片目录
    System.out.println("filePath="+filePath);
    //先判断是否存在,不存在就创建
    File storageFolder = new File(filePath);
    if (!storageFolder.exists()) {
        storageFolder.mkdirs();
    }
    //生成随机的文件名(当前时间+4位随机数)
    String suffix_temp = image.getOriginalFilename();
    String suffix = suffix_temp.substring(suffix_temp.lastIndexOf(".")+1); //获得后缀名称
    Random random = new Random();
    Integer randomFileName = random.nextInt(1000);
    String fileName = TimeUtil.TimeStr(TimeUtil.TIME_TYPE_ALL_PREFIX) + randomFileName +"." +  suffix;
    //假如文件不存在 即重新创建新的文件已防止异常发生
    File dest = new File(filePath + fileName);
    if (!dest.getParentFile().exists()) {
        dest.getParentFile().mkdirs();
    }
    try {
        image.transferTo(dest); //保存图片
    } catch (IOException e) {
        System.out.println("Save file error,e="+e.toString());
    }
    return fileName;
}

再生成图片的url
需要先在配置文件application.properties配置

#上传文件的配置
#设置url访问图片(访问url为:ip + 端口 +image+图片名,例如:http://xx.x.xx.xxx:80xx/image/857.png)
spring.mvc.static-path-pattern=/image/**
#图片真实的存放路径
spring.resources.static-locations=file:C://image/
//生成图片url
private String generateFileUrl(String filePath) {
    //合成图片URL(域名/IP+端口号+标记(static-path-pattern)+文件地址)
    String MARK = STATIC_PATH_PATTERN.substring(0,STATIC_PATH_PATTERN.length()-3);
    String url = "http://"+ IP + ":" +SERVER_PORT  + MARK+ filePath;
    return url;
}

最后把后台返回的url通过insertImage方法插入图片到文章编辑中。
文章的上传接口和图片基本类似,但还需要把生成的url和相关分类信息保存到对应的数据库中。

上一篇: 游戏社区App (五):首页的布局与数据整理
下一篇: 未完待续

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

游戏社区App (六):文章编辑与上传 的相关文章

  • 如何判断Android设备是否有触摸屏?

    我花了相当多的时间让我的 UI 仅支持键盘输入 但最终我不确定我是否可以相信 Android 设备都有触摸屏的假设 有没有办法判断Android设备是否有触摸屏 您应该研究现有设备并阅读Android 兼容性定义文档 http source
  • 更改 Java 字符串中的日期格式

    I ve a String代表一个日期 String date s 2011 01 18 00 00 00 0 我想将其转换为Date并将其输出到YYYY MM DD format 2011 01 18 我怎样才能实现这个目标 好的 根据我
  • Apache James 学习资源 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 该计划是创建一个列表阿帕奇 詹姆斯 http james apache org学习资源 涉及从设置到使用
  • 当我想用它来进行单独的 apk 测试时,出现“android.support.test.espresso 不存在”

    我需要在没有源代码的情况下对 Android 应用程序进行一些自动测试工作 我发现 Robotium 和 espresso 都可以完成这项工作 我决定使用 espresso 因为它有 Google 支持 我想使用相同的签名对目标 apk 和
  • Android SearchView 自定义

    我是 Android 新手 我被困在一些我认为很简单但我很困惑的事情上 我需要不在操作栏 工具栏中而是在我的相对布局中创建自定义 searchView 问题是我不知道如何自定义背景 文本输入颜色 XML 中的搜索图标颜色 或者只是它们的属性
  • 我应该在哪里以 Java MVC 模式调用我的 swingworker

    我有一个程序 其设置基本上与此 MVC 示例中的程序一样 http www leepoint net notes java GUI struct 40mvc html http www leepoint net notes java GUI
  • 加入牛轧糖热点

    我的应用程序有 2 个按钮 一个用于创建热点 另一个用于加入热点 流程是 我在其中一台设备上创建一个热点 然后尝试将其与其他设备连接 通过我的应用程序 问题是 有时我无法加入由 Nougat 设备创建的热点 它会卡在 获取 IP 地址 上
  • Java中对象类的继承

    当我读java书时 我遇到了 每个类都扩展类 Object 但是如果想要 B 类扩展 A 类 但是 B 类现在将具有多重继承 一个来自 Object 类 一个来自 A 类 如何解决冲突 谁能解释一下吗 它是多级继承 而不是多重 class
  • 使用可变参数绘制星形

    我的任务是编写程序 允许用户绘制星星 星星的大小和手臂数量可能不同 当我处理基本星时 我使用 GeneralPath 和点表进行处理 int xPoints 55 67 109 73 83 55 27 37 1 43 int yPoints
  • FirebaseAuth.getInstance().signOut() 不注销

    我尝试从 firebase 注销用户 但在关闭应用程序并再次打开后 用户仍然处于连接状态 我尝试从 firebase 定期注销用户 但没有解决问题 我想知道是什么导致了这个问题 logout setOnClickListener new V
  • PDFBox - 无障碍 PDF - 如何检查 PDF 标签是否具有符合无障碍指南的属性

    需要检查 PDF 标签是否具有符合辅助功能指南的属性 例子 H1 验证 PDF 中是否存在 H1 图像 图形标签 验证图像 图形是否具有 Alt 文本 语言 验证语言属性是否已设置 以便屏幕阅读器能够正确阅读 对于西班牙语和英语文档 应更新
  • 在 Android 中创建硬链接和符号链接

    我正在创建一个应用程序 我想在其中使用 Android 外部内存文件系统中的硬链接和符号链接 我尝试过使用命令 Os link oldpath newpath Os link oldpath newpath 但是 当我尝试这样做时 我收到此
  • Selenium WebDriver (java) 可以与浏览器的检查工具元素选择器交互吗?

    通过使用 selenium 我可以访问位于检查选项卡中的浏览器元素选择器 在浏览器中按 Ctrl Shift C 吗 我想使用该选择器 指向 一个元素 并使其在浏览器中突出显示 例如 简单的事情如下 WebElement elem driv
  • 正确检查 FTP 服务器连接

    我在程序开始时打开与 FTP 服务器的连接 在对服务器执行操作之前 我想检查连接是否已成功建立 最简单快速的方式 因此如果连接消失 我将尝试再次连接 我用这段代码来做到这一点 private boolean checkConnection
  • okHttp3 java.lang.NoSuchMethodError:没有虚拟方法 setCallWebSocket

    我已从 okhttp Retrofit 更新到 okhttp3 Retrofit2 但我的应用程序因此异常而无法启动 FATAL EXCEPTION EventThread Process appli speaky com PID 1470
  • MediaRecorder 纵向模式下的视频捕获

    我正在尝试制作自定义视频应用程序 Iwork 使用清单中的设置仅 2 2 API 8 一切顺利 但我不明白为什么纵向模式视频与横向模式视频没有区别 为了检测设备改变的方向 我在 surfaceChanged 中使用此代码 if mCamer
  • Firebase 令牌未生成

    我得到的令牌未生成 onTokenrefresh 没有调用 谁能帮忙 它已连接到 firebase 但令牌仍然没有生成 public class MyFireBaseInstanceId extends FirebaseInstanceId
  • SDK管理器不显示示例包选项

    我关注的是安卓安装示例的开发人员链接 http developer android com tools samples index html包裹 但是 当我展开Android平台的包列表时 没有 SDK示例 选项 复选框 可用 为什么 我已
  • 从 HashMap 中查找对象键

    我有一个 HashMap 其键作为我自己的对象 键作为 String 的 ArrayList 有没有一种方法可以从映射中获取与另一个对象相同的关键对象 而无需迭代映射 请注意 我的对象已经实现了 equals 和 hashcode 并且它只
  • 2 位小数格式的货币输入

    我需要将输入货币格式化为 2 位小数格式 例如 当用户输入 2 时 它看起来为 2 00 美元 然后当用户输入 2 时 它会转换为 22 00 美元 等等 我采用类似的方法 当用户输入 2 时 它会转换为 0 02 下一个 2 将是这样的

随机推荐

  • I2C通信基本原理及其实现

    I2C是一种总线式结构 它只需要SCL时钟信号线与SDA数据线 两根线就能将连接与总线上的设备实现数据通信 由于它的简便的构造设计 于是成为一种较为常用的通信方式 由于I2C采用的是主从式通信方式 所以 通信的过程完全由主设备仲裁 在通信之
  • 蓝桥杯2019年第十届省赛真题-扫地机器人

    题目 题目链接 题解 二分 贪心 二分模板 看到这道题第一时间想到的就是二分和动规 仔细一看二分有戏 能check出来 所以决定用二分好好想想 主要是因为我动规太菜了 怕了 二分时间 准确的说我们二分的不是时间 而是覆盖范围 也就是枚举每个
  • 《Python编程:从入门到实践》学习笔记——第11章 测试代码

    文章目录 前言 1 测试函数 1 1 单元测试和测试用例 1 2 可通过的测试 1 3 不能通过的测试 1 4 测试未通过时怎么办 1 5 添加新测试 2 测试类 2 1 各种断言方法 2 2 一个要测试的类 2 3 测试 Anonymou
  • 【机器学习】随机森林预测并可视化特征重要性

    今天需要用到特征重要性的分析 所以干脆就写一下使用随机森林是如何做建模并基于随机森林做特征重要性的分析 顺带给出了编码方式 随机森林 特征重要性可视化的完整Python代码 都是可以直接运行的 目 录 1 分类型特征编码 1 1 Label
  • cmd 命令行显示中文乱码

    cmd命令行显示中文乱码多数是由于字符编码不匹配导致 1 查看cmd编码方式 方法一 打开cmd 输入chcp命令回车 显示默认编码 活动代码页 936指GBK 方法二 打开cmd在标题栏单击鼠标右键选择 属性 在属性选项中可看到当前编码方
  • JAVA的OPENGL,JOGL入门实例----不断变色的点阵 (源代码)

    原文 http blog csdn net sidihuo article details 44035015 第一个类 代码解读 java view plain copy package test1 opengl import java a
  • AirtestIDE学习笔记---安装(windows系统)

    这篇写的更详细点 https blog csdn net u013405658 article details 99443091 Airtest之前有听到过这样的工具 一直没有小试牛刀 直到上周参加了TesterHome社区组织的测试开发者
  • gTest 学习

    gTest 目录 在Clion上安装 断言 判断bool 数值判断 字符串判断 显示返回成功或失败 异常检查 输出更详细信息 自定义输出 浮点数相等 相近判断 事件 全局事件 TestSuite事件 TestCase事件 参数化 在Clio
  • 【mcuclub】STC89C52单片机最小系统讲解

    1 实物图 2 原理图 3 介绍 3 1 主芯片 STC89C52是STC公司生产的一种低功耗 高性能8位微控制器 器件参数 1 增强型8051单片机 指令代码完全兼容传统8051 2 工作电压 5 5V 3 3V 3 工作频率范围 0 4
  • 从零开始的管理系统(自用)之三:.NET6后端框架搭建和私人Nuget服务搭建

    因为既然采用前后端分离的方式 就不想把所有功能都写在一个项目里面 对电脑性能的debug都是一种负担 于是采用微服务思想 将后端API按照业务拆分 因为肯定不能的服务会用到相同的代码块 因此搭建私人Nuget包用来封装相同的代码块 1 vs
  • 【C++】error: passing ‘const xxx’ as ‘this’ argument discards qualifiers [-fpermissive]

    1 错误信息分析 error passing const xxx as this argument discards qualifiers fpermissive 直译 错误 将 const xxx 作为 this 参数传递会丢弃限定词 d
  • 绿色开源的屏幕/截屏OCR软件Capture2Text

    近日发现一个比较好的绿色开源的屏幕 截屏OCR软件 Capture2Text 官网说明 http capture2text sourceforge net 项目地址 https sourceforge net projects captur
  • 仿射密码实验 C语言

    文件操作 FILE fp fp fopen r 打开文件 while fgets msg 50 fp1 NULL 读取文件中的数据 50 1 长度 到 msg数组 fprintf fp d num 向文件格式输入 最后记得关闭文件 函数 求
  • 使用Maven+Intellij快速创建一个SpringBoot项目——helloworld

    文章目录 一 从 http start spring io 生成maven项目 二 导入maven项目 三 maven项目目录结构 四 创建controller 五 运行项目 springboot内置了tomcat服务器 这样在web项目中
  • JSONObject 比 Map好使的地方

    需求 改originalJson中的json字符串的key 当key满足在configMapping中配置的key2情况的时候 把originalJson的key改成 configMapping中的value2 上代码 import cn
  • 【C语言】快速排序

    一 算法描述 一个基准 两个指针 一个前指针 一个后指针 前指针负责比基准小的数 后指针负责比基准大的数 前指针向后移动的过程中如果遇到比基准大的数就停止移动 交换前后指针的值 后指针向前移动的过程中如果遇到比基准小的数就停止移动 交换前后
  • java imagemagick 接口_ImageMagick安装及使用教程

    ImageMagick是一套功能强大且免费的图片处理开发包 可以用来读 写和处理多种格式的图片文件 本节介绍下ImageMagick的安装与使用方法 1 imagemagick安装 以linux下源码安装为例 首先到ImageMagick官
  • VC 根据域名获取IP

    include Winsock2 h pragma comment lib Ws2 32 lib 注意字符串需以 0结尾 例如 lpzSeverName www baidu com 0 bool WINAPI Domain2IP char
  • 使用Matplotlib画出线形图的简单教程

    import matplotlib pyplot as plt import numpy as np ipython 画图 pylab inline In 10 简单线图 生成测试数据 x np linspace 1 1 50 y np c
  • 游戏社区App (六):文章编辑与上传

    一 文章编辑 Android端 示例 1 富文本编辑器 富文本编辑器参考的是GitHub上RichEditotAndroid的富文本编辑器 实现方式为使用 WebView JavaScript 原理为使用WebView来显示一个本地HTML