vue实现用户上传图片后图片回显+点击预览显示大图

该文章展示了如何在Vue.js应用中创建一个包含上传按钮和预览功能的前端页面。代码包括上传前的限制(如文件类型和大小检查)、上传方法、处理超出限制的回调以及预览图片的逻辑。后端返回的是图片的相对路径,前端需要将其与基础API拼接以生成完整URL。

首先界面部分:直接上代码:


        <template>
          <el-form ref="form" :model="form">
            <el-form-item label="栗子1" prop="eg1">
              <el-upload
                ref="upload"
                action="#"
                :http-request="uploadFile"
                :before-upload="beforeUpload"
                :auto-upload="true"
                :limit="1"
                :on-exceed="handleExceed">
                <el-button size="small">
                  新增栗子1
                  <i class="el-icon-upload el-icon--right"></i>
                </el-button>
                <template slot-scope="scope">
                  <el-link>{{ scope.row.filePath }}</el-link>
                </template>
              </el-upload>
              <el-button size="small" @click="handlePreview">预览</el-button>
              <div v-if="previewImageUrl">
                <img :src="previewImageUrl" style="max-width:100%">
              </div>
            </el-form-item>
          </el-form>
        </template>

前端页面代码,一个上传按钮,一个预览按钮,上传3个方法:上传前,上传限制,上传

回显一个按钮:handlePreview方法.

后端我是返回的图片的相对路径

上传的代码:

uploadFile() {
                if (!this.attach) {
                    this.$message.warning("请先选择需要上传的文件!");
                    return;
                }
                let formData = new FormData();
                formData.append("attachFile", this.attach);
                console.log("上传附件在这里"+this.attach)
                uploadAttach(formData).then((filePath) => {
                    this.form.eg1 = filePath; // 将文件路径直接赋值给组件属性
                    this.getList();
                    console.log(this.form.bianzhi+"打印下栗子1")
                    this.previewImageUrl = process.env.VUE_APP_BASE_API + filePath;
                 // 更新预览图片 URL
                    this.$message.success("附件上传成功!");
                }).catch(() => {
                    this.$message.error("附件上传失败!")
                });
                this.$refs.upload.clearFiles();
            },

url需要用

process.env.VUE_APP_BASE_API + filePath; // 更新预览图片 URL

如果是服务器绝对路径无需拼接了,直接url赋值进去ok

上传前加上传限制代码:

              handleExceed(files, fileList) {
                this.$message({
                    showClose: true,
                    message: `最多只能选择1个附件`,
                    type: `warning`
                });
            },
            beforeUpload(file) {
                this.attach = file;
                let isLt10M = file.size / 1024 / 1024 < 20;
                if (!isLt10M) {
                    this.$message.error("上传的附件大小不能超过20MB!")
                }
                return isLt10M;
                },

最后是回显代码:

            handlePreview() {
                if (this.previewImageUrl) {
                    console.log(this.previewImageUrl+"看看显示的url对不对")
                    this.$alert(`<img src="${this.previewImageUrl}" width="100%">`, {
                        dangerouslyUseHTMLString: true,
                        callback: () => {}
                    });
                } else {
                    console.log(this.previewImageUrl+"看看显示的url对不对")
                    this.$message.warning("没有上传文件!");
                }
            },

最后注意要在data里添加相对应的属性变量:

data() {
            return { 
                showPreview: false,
                previewImageUrl: '',


    }
}

### VueElementUI 实现图片上传回显 为了实现图片上传及其回显的功能,在前端部分可以利用 `element-ui` 提供的 `<el-upload>` 组件。该组件支持多种配置选项,能够很好地适应不同场景下的需求。 #### 属性设置 几个重要的属性对于控制文件的选择和展示至关重要: - **action**: 设置上传接口地址。 - **list-type**: 使用 `"picture-card"` 来创建照片墙样式的列表[^1]。 - **auto-upload**: 默认情况下设为 `false` 以便于手动触发上传操作。 - **on-preview**, **on-remove** 及其他事件处理函数用于自定义交互逻辑,比如预览已选文件或移除某项前执行特定动作。 - **http-request**: 自定义上传请求行为,当需要对接特殊的服务器端API时非常有用[^4]。 - **file-list**: 初始文件列表,可用于页面加载完成后填充已有资源的数据以达到回显的效果[^3]。 下面给出一段简单的HTML模板代码片段作为例子说明如何构建一个多图片上传区域,且能够在选择新图片之后立即显示出缩略图形式的预览;同时也展示了怎样通过编程方式调用上传过程而不是依赖默认的行为。 ```html <template> <div id="app"> <!-- 图片上传 --> <el-upload action="#" list-type="picture-card" :auto-upload="false" :on-change="handleChange" :before-upload="handleBeforeUpload" :on-remove="handleRemove" :file-list="imageList" multiple > <i slot="default" class="el-icon-plus"></i> <div slot="file" slot-scope="{ file }"> <img class="el-upload-list__item-thumbnail" :src="file.url" alt="" /> <span class="el-upload-list__item-actions"> <span @click="handlePictureCardPreview(file)"> <i class="el-icon-zoom-in"></i> </span> <span @click="handleDownload(file)"> <i class="el-icon-download"></i> </span> <span @click="handleRemove(file)"> <i class="el-icon-delete"></i> </span> </span> </div> </el-upload> <!-- 对话框显示大图 --> <el-dialog :visible.sync="dialogVisible"> <img width="100%" :src="dialogImageUrl" alt="" /> </el-dialog> <!-- 手动上传按钮 --> <el-button type="primary" @click="submitUpload">上传</el-button> </div> </template> ``` 接着是对应的JavaScript/TypeScript脚本部分,这里假设使用Vue CLI 创建的应用程序结构: ```javascript <script> export default { data() { return { imageList: [], // 存储当前选定的图片信息对象数组 dialogImageUrl: '', // 当前被点击查看的大图链接 dialogVisible: false, // 控制对话框可见性的布尔变量 }; }, methods: { handleChange(file, fileList) { this.imageList = fileList; }, handleBeforeUpload(file) { const isJPGOrPNG = ['image/jpeg', 'image/png'].indexOf(file.type) !== -1; if (!isJPGOrPNG) { this.$message.error('仅限jpg/png格式!'); } const isLt2M = file.size / 1024 / 1024 < 2; if (!isLt2M) { this.$message.error('图片大小不超过2MB!'); } return isJPGOrPNG && isLt2M; }, handleRemove(file) { console.log(`删除${file.name}`); }, handlePictureCardPreview(file) { this.dialogImageUrl = file.url; this.dialogVisible = true; }, handleDownload(file) { window.open(file.url); }, submitUpload() { let formData = new FormData(); for (let i = 0; i < this.imageList.length; i++) { formData.append("files", this.imageList[i].raw); // 将原始File对象加入到FormData中 } fetch('/api/upload', { method: "POST", body: formData }) .then((response) => response.json()) .then((result) => { console.log(result.message); }); } } }; </script> ``` 这段代码实现了基本的多图片选择、本地预览以及批量上传至指定URL的功能。实际项目开发过程中可能还需要考虑更多细节问题,例如错误提示优化、进度条显示等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值