OSS上传图片无法在线预览的解决方案


最近在做的项目涉及到商品详情,由于前端用的flutter框架并且该详情为富文本,dart语言关于富文本的组件不是非常友好,当富文本中的图片无法在浏览器中直接预览的时候(有时提示为下载链接),富文本组件无法显示。


先记录一下踩过的坑: 富文本中的图片也需要相应的服务器进行存储,否则会直接转化成十六进制码存放在数据库中,如果图片尺寸很大,尤其像商品详情那样的长图来说,不管是存储还是网络传输,都是非常消耗性能的,所以富文本中的图片也需要上传至服务器。我的后台管理系统使用的是的react框架,用到的一款富文本编辑组件是wangeditor,该组件可以设置嵌套图片的上传路径以及大小限制,非常方便,推荐使用。

下列是我的后台管理系统自己封装的富文本组件:

import React from 'react';
import PropTypes from 'prop-types';
import { noop, get } from 'lodash';
import E from 'wangeditor';
import { message } from 'antd';
import CustomConfig from '../../../../env'
import {getToken} from "../../../../utils/authority"; export class RichTextEditor extends React.Component {
componentDidMount() {
const { value, onChange } = this.props;
const elem = this.editor;
const editor = new E(elem);
this.configUploadPic(editor);
// 使用 onchange 函数监听内容的变化,并实时更新到 state 中
editor.customConfig.onchange = html => {
onChange(html);
};
editor.create();
editor.txt.html(value);
} configUploadPic = editor => {
editor.customConfig.uploadImgServer = CustomConfig.BASE_URL + '/api/file/upload_embed_image';
editor.customConfig.uploadImgHeaders = {
//添加token
authorization: getToken(),
};
editor.customConfig.uploadImgMaxSize = 5 * 1024 * 1024; // 图片大小限制5M
editor.customConfig.uploadImgMaxLength = 1; //一次最多一张图片
editor.customConfig.uploadImgTimeout = 25000; //25秒超时
editor.customConfig.uploadFileName = 'file';
editor.customConfig.customAlert = function(info) {
// info 是需要提示的内容
console.log(info);
};
editor.customConfig.uploadImgHooks = {
error: function(xhr, editor) {
// 图片上传出错时触发
// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
message.error(`图片上传失败,${get(xhr, ['responseText'])}`);
},
timeout: function(xhr, editor) {
// 图片上传超时时触发
// xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
message.error(`图片上传超时!`);
}, // 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置
// (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)
customInsert: function(insertImg, result, editor) {
// 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
// insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果 // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
const url = result.url;
insertImg(url);
// result 必须是一个 JSON 格式字符串!!!否则报错
},
};
}; render() {
return (
<div
ref={ref => {
this.editor = ref;
}}
/>
);
}
} RichTextEditor.protoType = {
value: PropTypes.string,
onChange: PropTypes.func,
}; RichTextEditor.defaultProps = {
value: '',
onChange: noop,
};

顺便提一下,lodash是一款非常方便、高效的集合处理工具,推荐使用。

回到正题

由于我使用的是阿里提供的OSS对象存储,我在网上查找了相关的资料,都找不到相应的解决方案,最后查看了官方的开发文档,设置Content-type之后终于得到解决,下面是相关代码(使用kotlin):

    private fun MultipartFile.savePic(folderName:String = "pic"):String {
fun getExtension(): String {
val extension = this.originalFilename.orEmpty().substringAfterLast(".", "")
return if (extension.isEmpty()) {
""
} else
".$extension"
} // 添加 ContentType (添加后可在浏览器中直接浏览,而非下载链接)
val objectMetadata = ObjectMetadata()
objectMetadata.contentType = "image/jpg" val objName = "$folderName/${UUID.randomUUID()}${getExtension()}"
try {
ossClient.putObject(bucketName, objName, this.inputStream, objectMetadata)
} catch (e: Exception) {
logger.error("上传图片失败", e)
throw BadRequestException("上传图片失败")
}
return objName
}

OSS上传图片无法在线预览的解决方案的更多相关文章

  1. 实现在线预览PDF的几种解决方案

    因客户需要实现PDF的预览处理,在网上找了一些PDF在线预览的解决方案,有的用PDFJS的在线预览方式,有的使用PDFObject的嵌入式显示,有的通过转换JPG/PNG方式实现间接显示的方式,开始是 ...

  2. [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!

    引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案一 直接在浏览器中打开Office文档在页面上的链接.会弹出如下窗口: 优点:主流浏览器都支持. 缺点: ...

  3. [Asp.net]常见word,excel,ppt,pdf在线预览方案(转)

    引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案一 直接在浏览器中打开Office文档在页面上的链接.会弹出如下窗口: 优点:主流浏览器都支持. 缺点: ...

  4. kkfileview v2.0 发布,文件在线预览项目方案

    kkfileview文件在线预览 此项目为文件文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署,部署好后可以独立提供预览服务,使用http接口访问,不需要和应用集成,具 ...

  5. word文档在线预览解决方案

    花了一整天在网上翻关于 “word文档在线预览解决方案” 相关的资料,感觉实现难度比较大还是用PDF来解决好了.. 下面列一下比较好的参考资料吧 参考资料 前端实现在线预览pdf.word.xls.p ...

  6. SpringBoot-文件在线预览解决方案-基于OpenOffice及jacob

    项目中有一个需求:实现文件(主要是Office文件)的在线预览,根据前端需求,Office文件需要转换成pdf或者html方可在浏览器中打开预览,那么后端需要将文件转为pdf/格式返回地址给前端.目前 ...

  7. 基于CA认证(结合文档在线预览)的电子签章解决方案

    分享一个基于CA认证(结合文档在线预览)的电子签章实现思路,恰巧是最近项目中遇到的,欢迎大家一起讨论. 一. 项目背景 在公司业务系统中,按照传统的签章方式,存在以下痛点: 1.成本高,体现在纸质合同 ...

  8. Asp.Net在线预览Word文档的解决方案与思路

    前几天有个老项目找到我,有多老呢?比我工作年限都长,见到这个项目我还得叫一声前辈. 这个项目目前使用非常稳定,十多年了没怎么更新过,现在客户想加一个小功能:在线预览Word文档. 首先想到的是用第三方 ...

  9. koa中上传文件到阿里云oss实现点击在线预览和下载

    比较好的在线预览的方法: 跳转一个新的页面,里面放一个iframe标签,或者object标签 <iframe src="xxx"></iframe> < ...

随机推荐

  1. Android Animation动画实战(二):从屏幕底部弹出PopupWindow

    在这篇文章之前,我已经陆陆续续写了几篇博客,介绍了Android Animation是如何使用的,有还不明白的,可以点击查看: 1. Android Animation动画详解(一): 补间动画 2. ...

  2. mac 安装 adb

    安装命令 brew cask install android-platform-tools 测试安装情况 adb devices 设备打开开发者模式 略 查看log并过滤出设备id adb logca ...

  3. java 创建线程方式

    1.继承Thread类 子类覆写父类中的run方法,将线程运行的代码存放在run中. 建立子类对象的同时线程也被创建. 通过调用start方法开启线程. 2.实现Runnable接口 子类覆盖接口中的 ...

  4. THINKPHP框架的优秀开源系统推荐

    THINKPHP框架的优秀开源系统推荐 众所周知,国内众多优秀的开源框架,ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性.并且拥有众多的原创功能 ...

  5. P2P公司是如何进行风险管理的

    关于P2P的风控很多人仍然是一知半解,甚至不少长期P2P圈内的资深玩家对此也是“既没吃过猪肉,也没见过猪跑”.   但是不可否认的是,作为一种跳过银行间接贷款融资模式的.一种在借款人和出借人之间直接发 ...

  6. The 10th Shandong Provincial Collegiate Programming Contest H.Tokens on the Segments(贪心+优先级队列 or 贪心+暴力)

    传送门 •题意 二维平面上有 n 条线段,每条线段坐标为 $(l_i,i),(r_i,i)$: 平面上的每个整点坐标上都可以放置一枚硬币,但是要求任意两枚硬币的横坐标不相同: 问最多有多少条线段可以放 ...

  7. linux ioctl 方法

    ioctl, 我们在第 1 章展示给你如何使用, 是一个系统调用, 作用于一个文件描述符; 它 接收一个确定要进行的命令的数字和(可选地)另一个参数, 常常是一个指针. 作为一个使 用 /proc 文 ...

  8. vuex 快速上手,具体使用方法总结(含使用例子)

    网上有关vuex的文章很多,但有些比较复杂,这篇文章能让你快速使用vuex: vuex 用处:管理全局状态(类似全局变量,每个组件都能访问到) vuex 用法: //下面是一个js文件,用最简单最全的 ...

  9. Java中的断言assert的用法

    Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多. 二.语法 在Java中,ass ...

  10. 【50.00%】【codeforces 747C】Servers

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...