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

本文详细介绍了一款基于Android的富文本编辑器的实现过程,包括如何使用WebView和JavaScript进行富文本编辑,调整图片大小以适应屏幕,以及如何集成图片上传功能。同时,介绍了SpringBoot后端接口的设计,用于处理图片上传和文章发布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、文章编辑-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 (五):首页的布局与数据整理
下一篇: 未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值