Vue中将本地照片回显到前端页面

本文介绍了一种前端如何通过调用后台接口实现单张或多张照片的回显。前端使用axios库,结合Vue.js的数据绑定,通过循环调用接口将本地路径转换为可显示的URL。后端接口利用HttpServletRequest和HttpServletResponse读取并返回照片数据。这种方法适用于需要在前端展示从本地获取的图片的场景。

前端调用方法
此方法目前只支持单次回显照片;
如需多张照片回显,需要循环多次调用后台接口。

// 需要导入axios
import axios from 'axios'

data() {
	return {
    	imgUrls:[]
    }
}
methods: {
// 照片回显(传入本地路径做为参数)
	view(path) {
	   axios({
	     method: 'post',
	     headers: { Auth: localStorage.getItem('token') },// 如果需要,传入token到请求头
	     url: '/aaa/bbbb/fileOutputStream.z',// 请求的url
	     params: { path: path },// 照片存放的本地路径
	     responseType: 'blob' // 更改responseType类型为 blob
	   }).then(res => {
	     const url= window.URL.createObjectURL(new Blob([res.data], { type: 'image/jpeg;charset=utf-8' }))
	     this.imgUrls.push(url)
	   }).catch(error => {
	     this.$message({
	       type: 'error',
	       message: '系统异常:' + error,
	       center: false
	     })
	   })
	}
}

前端的HTML

<!-- 这里用el-image和原生img都行 -->
<div v-for="(url,index) in imgUrls" :key="index" style="display: inline-block">
	<el-image style="width: 148px;height: 148px" :src="url" fit="cover"></el-image>
</div>

后端接口

@RequestMapping("/fileOutputStream")
public void fileOutputStream(HttpServletRequest request,HttpServletResponse response) throws Exception {
	FileInputStream input = null;
	OutputStream outputStream = null;
	try {
		String file = request.getParameter("path");
		File f = new File(file);
		byte[] data = null;
		input = new FileInputStream(f);
		data = new byte[input.available()];
		input.read(data);

		outputStream = response.getOutputStream();
		outputStream.write(data);
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		IOUtils.closeQuietly(input);
		outputStream.flush();
		IOUtils.closeQuietly(outputStream);
	}
}
<think> 我们正在处理关于vue-ueditor-wrap上传视频并回显的问题。根据引用[1]的描述,用户遇到了上传大视频失败的问题,但我们现在关注的是如何实现上传并回显。 由于引用中提到了上传失败的问题,但我们当前问题是如何实现上传并回显,因此我们需要提供一般性的方法,同时注意可能的大文件上传问题(但用户主要问的是回显)。 步骤: 1. 配置上传接口:确保后端有接收视频上传的接口,并返回视频的访问URL。 2.vue-ueditor-wrap中配置视频上传的相关参数,如serverUrl(上传接口地址)等。 3. 上传成功后,编辑器会自动将视频插入到编辑区域(即回显),因为UEditor本身支持上传后插入。 但是,需要注意的是,vue-ueditor-wrap是对UEditor的封装,因此我们需要按照UEditor的配置方式进行。 具体步骤: a) 安装并引入vue-ueditor-wrap组件。 b) 配置组件的ueditorConfig,设置serverUrl为后端上传接口。 c) 在上传成功后,UEditor会自动将视频显示在编辑器中(回显)。 另外,如果上传大文件,可能需要考虑分片上传或断点续传,但用户当前的问题主要是回显,因此我们主要关注如何配置上传以及回显。 代码示例: 在Vue组件中: 1. 引入vue-ueditor-wrap组件 2. 配置ueditorConfig,包括serverUrl(视频上传的接口)等 3. 在模板中使用vue-ueditor-wrap 注意:回显是自动的,上传成功后编辑器内会显示视频。 但是,如果用户想要在非编辑状态下显示(比如在详情页),那么我们需要单独处理:将上传后得到的视频URL保存,然后在详情页使用video标签展示。 因此,我们需要分两种情况: 情况1:在编辑器中回显(上传成功即插入编辑器) 情况2:在非编辑器环境(如详情页)展示视频 针对情况1,我们只需要按照编辑器配置即可。 针对情况2,我们需要在上传成功后,从编辑器的内容中提取视频地址,或者在上传成功的回调中将视频地址保存到另一个变量中。 由于用户问的是vue-editor-wrap实现视频上传并回显,我们主要关注在编辑器中回显。 具体实现: 1. 安装依赖 ```bash npm install vue-ueditor-wrap ``` 2.Vue组件中使用 ```vue <template> <vue-ueditor-wrap v-model="content" :config="myConfig"></vue-ueditor-wrap> </template> <script> import VueUeditorWrap from 'vue-ueditor-wrap' export default { components: { VueUeditorWrap }, data () { return { content: '', // 编辑器的内容 myConfig: { // 设置服务器接口(这里假设是视频上传的接口,实际上UEditor的上传接口可以同时处理图片、视频等) serverUrl: 'http://your-api-domain.com/ueditor/upload', // 根据实际情况修改 // 其他配置,例如配置视频上传的最大大小等 maximumWords: 100000, // 视频上传配置项 videoMaxSize: 1024 * 1024 * 800, // 800MB,根据需求调整 videoAllowFiles: ['.mp4', '.avi', '.wmv', '.rm', '.rmvb', '.mkv'], // 允许的视频格式 // 可以配置其他UEditor的选项 } } } } </script> ``` 注意:UEditor在视频上传成功后会返回一个包含视频URL的JSON,然后编辑器会自动插入视频到内容中,即我们说的回显。 但是,如果上传大文件遇到问题(如引用[1]中的问题),可能需要调整服务器配置(如请求超时时间、文件大小限制等),或者采用分片上传。但这不是当前问题的重点。 如果用户需要在上传时获取视频URL以便在其他地方使用,可以监听编辑器的事件,例如: ```vue <template> <vue-ueditor-wrap v-model="content" :config="myConfig" @beforeInit="addListener"></vue-ueditor-wrap> </template> <script> import VueUeditorWrap from 'vue-ueditor-wrap' export default { components: { VueUeditorWrap }, data () { return { content: '', myConfig: { serverUrl: 'http://your-api-domain.com/ueditor/upload' } } }, methods: { addListener (editorId) { // 在初始化之前添加监听 // 注意:这里需要在编辑器实例创建后监听,所以放在beforeInit中,但实际监听需要在实例创建后,因此可以使用setTimeout或监听ready事件 window.UE.getEditor(editorId).ready(() => { // 监听视频上传成功事件 window.UE.getEditor(editorId).addListener('afterUpVideo', (t, arg) => { // arg是上传视频后的返回信息,其中包含视频的url console.log('视频上传成功', arg) // 这里可以获取到视频的url,然后可以存储起来 // arg[0].url 是视频地址 }) }) } } } </script> ``` 这样,我们就可以在视频上传成功后获取到视频的URL,用于其他用途(比如在非编辑器环境中显示)。 总结: - 在编辑器中回显:自动完成。 - 在非编辑器环境中显示:需要在上传成功后获取视频URL,然后使用video标签展示。 因此,用户可以根据需求选择不同的方式。 注意:引用[1]中提到的问题(上传大视频失败)可能是由于服务器配置或网络环境导致,但本问题主要关注上传并回显的方法,所以这里不展开。 相关问题: 根据用户的问题,我们可以生成以下相关问题: 1. 如何配置vue-ueditor-wrap的视频上传大小限制? 2. 如何监听vue-ueditor-wrap的视频上传事件? 3.vue-ueditor-wrap中上传视频后,如何获取视频的URL并在其他地方显示? 4. 如何解决vue-ueditor-wrap上传大视频失败的问题? 但注意,用户当前的问题已经解决,我们只需要生成相关问题即可。 因此,回答的结构: 1. 介绍实现视频上传并回显的方法(在编辑器中自动回显)。 2. 提供代码示例(包括配置和事件监听)。 3. 说明如何获取视频URL用于非编辑器环境。 4. 生成相关问题。 注意:引用[1]中的问题(上传失败)可能与大文件有关,但我们这里主要回答上传并回显的方法,如果用户遇到上传失败,可能需要单独处理,但不在本问题范围内。 最终回答: </think> 针对vue-ueditor-wrap实现视频上传并回显的方法,以下是详细实现步骤和代码示例: ### 一、基础配置步骤 1. **安装依赖** ```bash npm install vue-ueditor-wrap ``` 2. **配置上传接口** 在`ueditor.config.js`中设置视频上传路径: ```javascript window.UEDITOR_CONFIG = { serverUrl: "/api/ueditor/upload", // 后端视频上传接口 videoMaxSize: 1024 * 1024 * 500, // 500MB大小限制 videoAllowFiles: [".mp4", ".avi", ".wmv"], // 允许的视频格式 } ``` 3. **组件初始化** ```vue <template> <vue-ueditor-wrap v-model="content" :config="editorConfig" @ready="onEditorReady" /> </template> <script> import VueUeditorWrap from 'vue-ueditor-wrap' export default { components: { VueUeditorWrap }, data() { return { content: "", // 编辑器内容 editorConfig: { initialFrameHeight: 500, // 编辑器高度 } } }, methods: { onEditorReady(editor) { // 监听视频上传成功事件 editor.addListener('afterUpVideo', (file, res) => { this.handleVideoUploadSuccess(res) }) }, handleVideoUploadSuccess(response) { // 处理上传响应(需根据后端返回结构调整) const videoUrl = response.url; console.log("视频地址:", videoUrl); } } } </script> ``` ### 二、关键实现逻辑 1. **视频回显原理** - 上传成功后,UEditor会自动将`<video>`标签插入编辑器 - 视频标签示例: `<video src="https://your-domain.com/uploads/video.mp4" controls="controls"></video>` 2. **后端响应要求** 后端需返回UEditor兼容的JSON格式: ```json { "state": "SUCCESS", "url": "https://cdn.example.com/video.mp4", "title": "demo.mp4", "original": "demo.mp4" } ``` 3. **手动插入视频(可选)** ```javascript // 获取编辑器实例 const editor = this.$refs.ueditor.editor; // 插入视频到光标位置 editor.execCommand('insertHtml', ` <video src="${videoUrl}" controls style="max-width:100%" ></video> `); ``` ### 三、注意事项 1. **跨域问题** 在`vue.config.js`中配置代理: ```javascript devServer: { proxy: { '/api/ueditor': { target: 'http://your-backend.com', changeOrigin: true } } } ``` 2. **大文件上传优化** - 分片上传:修改UEditor的`videoUploadSplitSize`配置(默认10MB) - 增加超时时间: ```javascript editorConfig: { videoUploadTimeout: 120000 // 2分钟超时 } ``` 3. **视频预览样式优化** 在全局CSS中添加: ```css video { max-width: 100%; display: block; margin: 10px 0; } ``` ### 四、完整工作流程 ```mermaid graph TD A[用户选择视频] --> B[前端调用UEditor上传接口] B --> C{后端处理} C -->|成功| D[返回视频URL和成功状态] C -->|失败| E[返回错误信息] D --> F[UEditor自动插入video标签] E --> G[前端显示'上传失败'提示] F --> H[编辑器内实时显示视频] ``` ### 五、示例效果 ```vue <!-- 编辑器内生成的视频元素 --> <div class="edui-video-container"> <video src="https://example.com/upload/video.mp4" controls poster="https://example.com/thumbnail.jpg" > 您的浏览器不支持视频播放 </video> </div> ``` [^1]: 引用参考:vue-ueditor-wrap视频上传失败问题分析
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值