精华内容
下载资源
问答
  • 毕竟只是一个新手,解决这种复杂点的问题(相对而言),还是需要花费大量时间的,这篇文章花了两天的时间才实现的功能,现在就记录一下使用springboot怎么实现文件上传下载的。 我这里使用的是 springboot 2.0.3,...

    我先看一下《颈椎病康复指南》再给大家说怎么实现的这两个功能,毕竟只是一个新手,解决这种复杂点的问题(相对而言),还是需要花费大量时间的,这篇文章花了两天的时间才实现的功能,现在就记录一下使用springboot怎么实现文件上传下载的。

    我这里使用的是 springboot 2.0.3,不需要导入相关jar包,2.x 的版本已经整合进去了,直接使用即可。

    spring官网提供了 springboot 的文件上传下载案例,这是网址:https://spring.io/guides/gs/uploading-files/,使用的是流的输出,对于我这个新手来说,直接不理解,所以略过,通过网上查阅大量资料,终于把问题解决了。下面的案例是 springboot2.x 图片上传与回显。我使用的工具是idea。

    1、创建idea默认的springboot项目,我的版本是2.0.3

    2、创建一个控制层FileController

    package com.rainy.controller;
    
    import org.apache.catalina.servlet4preview.http.HttpServletRequest;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.*;
    import java.util.UUID;
    
    /**
     * 文件上传
     */
    @Controller
    public class FileController {
    
        @GetMapping(value = "/file")
        public String file() {
            return "file";
        }
    
        @PostMapping(value = "/fileUpload")
        public String fileUpload(@RequestParam(value = "file") MultipartFile file, Model model, HttpServletRequest request) {
            if (file.isEmpty()) {
                System.out.println("文件为空空");
            }
            String fileName = file.getOriginalFilename();  // 文件名
            String suffixName = fileName.substring(fileName.lastIndexOf("."));  // 后缀名
            String filePath = "D://temp-rainy//"; // 上传后的路径
            fileName = UUID.randomUUID() + suffixName; // 新文件名
            File dest = new File(filePath + fileName);
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
            try {
                file.transferTo(dest);
            } catch (IOException e) {
                e.printStackTrace();
            }
            String filename = "/temp-rainy/" + fileName;
            model.addAttribute("filename", filename);
            return "file";
        }
    }
    

    3、创建MyWebMvcConfigurer,这里是配置资源映射路径,详细点的介绍看这篇文章:https://blog.csdn.net/qq_38762237/article/details/81283241

    /**
     * 资源映射路径
     */
    @Configuration
    public class MyWebAppConfigurer implements WebMvcConfigurer {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/temp-rainy/**").addResourceLocations("file:D:/temp-rainy/");
        }
    }
    

    4、jsp页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <form action="/fileUpload" method="post" enctype="multipart/form-data">
            <label>上传图片</label>
            <input type="file" name="file"/>
            <input type="submit" value="上传"/>
        </form>
        <p>图片:</p>
        <img src="${filename }"/>
    </body>
    </html>
    
    

    注意一点:我是使用jsp引擎来渲染,因为我不会用 Thymeleaf,添加jsp页面,springboot使用jsp页面是需要进行配置jsp整合的,默认的是 Thymeleaf 的页面,简单的就是HTML页面

    springboot配置jsp页面的方法:https://blog.csdn.net/qq_38762237/article/details/81283352

    这里写图片描述

    推荐项目

    微信公众号

    每天Get一个小技巧

    展开全文
  • 使用Vue实现图片上传的三种方式

    万次阅读 多人点赞 2019-03-06 19:26:48
    项目中需要上传图片可谓是经常遇到的需求,本文将介绍 3 种不同的图片上传方式,在这总结分享一下,有什么建议或者意见,请大家踊跃提出来。 没有业务场景的功能都是耍流氓,那么我们先来模拟一个需要实现的业务场景...

    项目中需要上传图片可谓是经常遇到的需求,本文将介绍 3 种不同的图片上传方式,在这总结分享一下,有什么建议或者意见,请大家踊跃提出来。

    没有业务场景的功能都是耍流氓,那么我们先来模拟一个需要实现的业务场景。假设我们要做一个后台系统添加商品的页面,有一些商品名称、信息等字段,还有需要上传商品轮播图的需求。

    我们就以Vue、Element-ui,封装组件为例子聊聊如何实现这个功能。其他框架或者不用框架实现的思路都差不多,本文主要聊聊实现思路。

    1.云储存

    常见的 七牛云,OSS(阿里云)等,这些云平台提供API接口,调用相应的接口,文件上传后会返回图片存储在服务器上的路径,前端获得这个路径保存下来提交给后端即可。此流程处理相对简单。

    主要步骤

    • 向后端发送请求,获取OSS配置数据
    • 文件上传,调用OSS提供接口
    • 文件上传完成,后的文件存储在服务器上的路径
    • 将返回的路径存值到表单对象中

    代码范例

    我们以阿里的 OSS 服务来实现,们试着来封装一个OSS的图片上传组件。

    通过element-ui的upLoad组件的 http-request 参数来自定义我们的文件上传,仅仅使用他组件的样式,和其他上传前的相关钩子(控制图片大小,上传数量限制等)。

    <template>
     <el-upload
      list-type="picture-card"
      action="''"
      :http-request="upload"
      :before-upload="beforeAvatarUpload">
      <i class="el-icon-plus"></i>
     </el-upload>
    </template>
     
    <script>
     import {getAliOSSCreds} from '@/api/common' // 向后端获取 OSS秘钥信息
     import {createId} from '@/utils' // 一个生产唯一的id的方法
     import OSS from 'ali-oss'
     
     export default {
      name: 'imgUpload',
      data () {
       return {}
      },
      methods: {
       // 图片上传前验证
       beforeAvatarUpload (file) {
        const isLt2M = file.size / 1024 / 1024 < 2
        if (!isLt2M) {
         this.$message.error('上传头像图片大小不能超过 2MB!')
        }
        return isLt2M
       },
       // 上传图片到OSS 同时派发一个事件给父组件监听
       upload (item) {
        getAliOSSCreds().then(res => { // 向后台发请求 拉取OSS相关配置
         let creds = res.body.data
         let client = new OSS.Wrapper({
          region: 'oss-cn-beijing', // 服务器集群地区
          accessKeyId: creds.accessKeyId, // OSS帐号
          accessKeySecret: creds.accessKeySecret, // OSS 密码
          stsToken: creds.securityToken, // 签名token
          bucket: 'imgXXXX' // 阿里云上存储的 Bucket
         })
         let key = 'resource/' + localStorage.userId + '/images/' + createId() + '.jpg' // 存储路径,并且给图片改成唯一名字
         return client.put(key, item.file) // OSS上传
        }).then(res => {
         console.log(res.url)
         this.$emit('on-success', res.url) // 返回图片的存储路径
        }).catch(err => {
         console.log(err)
        })
       }
      }
     }
    </script>
    

    传统文件服务器上传图片

    此方法就是上传到自己文件服务器硬盘上,或者云主机的硬盘上,都是通过 formdata 的方式进行文件上传。具体的思路和云文件服务器差不多。

    主要步骤

    • 设置服务器上传路径、上传文件字段名、header、data参数等
    • 上传成功后,返回服务器存储的路径
    • 返回的图片路径存储到表单提交对象中

    代码示例

    此种图片上传根据element-ui的upLoad组件只要传入后端约定的相关字段即可实现,若使用元素js也是生成formdata对象,通过Ajax去实现上传也是类似的。

    这里只做一个简单的示例,具体请看el-upload组件相文档就能实现

    <template>
     <el-upload
      ref="imgUpload"
      :on-success="imgSuccess"
      :on-remove="imgRemove"
      accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"
      :headers="headerMsg"
      :action="upLoadUrl"
      multiple>
      <el-button type="primary">上传图片</el-button>
     </el-upload>
    </template>
     
    <script>
     import {getAliOSSCreds} from '@/api/common' // 向后端获取 OSS秘钥信息
     import {createId} from '@/utils' // 一个生产唯一的id的方法
     import OSS from 'ali-oss'
     
     export default {
      name: 'imgUpload',
      data () {
       return {
         headerMsg:{Token:'XXXXXX'},
         upLoadUrl:'xxxxxxxxxx'
       }
      },
      methods: {
       // 上传图片成功
       imgSuccess (res, file, fileList) {
        console.log(res)
        console.log(file)
        console.log(fileList)  // 这里可以获得上传成功的相关信息
       }
      }
     }
    </script>
    

    图片转 base64 后上传

    有时候做一些私活项目,或者一些小图片上传可能会采取前端转base64后成为字符串上传。当我们有这一个需求,有一个商品轮播图多张,转base64编码后去掉data:image/jpeg;base64,将字符串以逗号的形势拼接,传给后端。我们如何来实现呢。

    1.本地文件如何转成 base64

    我们通过H5新特性 readAsDataURL 可以将文件转base64格式,轮播图有多张,可以在点击后立马转base64也可,我是在提交整个表单钱一次进行转码加工。

    具体步骤

    • 新建文件封装 异步 转base64的方法
    • 添加商品的时候选择本地文件,选中用对象保存整个file对象
    • 最后提交整个商品表单之前进行编码处理

    在这里要注意一下,因为 readAsDataURL 操作是异步的,我们如何将存在数组中的若干的 file对象,进行编码,并且按照上传的顺序,把编码后端图片base64字符串储存在一个新数组内呢,首先想到的是promise的链式调用,可是不能并发进行转码,有点浪费时间。我们可以通过循环 async 函数进行并发,并且排列顺序。请看 methods 的 submitData 方法

    utils.js

    export function uploadImgToBase64 (file) {
     return new Promise((resolve, reject) => {
      const reader = new FileReader()
      reader.readAsDataURL(file)
      reader.onload = function () { // 图片转base64完成后返回reader对象
       resolve(reader)
      }
      reader.onerror = reject
     })
    }
    

    添加商品页面 部分代码

    <template>
     <div>
       <el-upload
        ref="imgBroadcastUpload"
        :auto-upload="false" multiple
        :file-list="diaLogForm.imgBroadcastList"
        list-type="picture-card"
        :on-change="imgBroadcastChange"
        :on-remove="imgBroadcastRemove"
        accept="image/jpg,image/png,image/jpeg"
        action="">
        <i class="el-icon-plus"></i>
        <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过2M</div>
       </el-upload>
       <el-button>submitData</el-button> 
     </div>
    </template>
     
    <script>
     import { uploadImgToBase64 } from '@/utils' // 导入本地图片转base64的方法
     
     export default {
      name: 'imgUpload',
      data () {
       return {
        diaLogForm: {
          goodsName:'', // 商品名称字段
          imgBroadcastList:[], // 储存选中的图片列表
          imgsStr:''   // 后端需要的多张图base64字符串 , 分割
        }
       }
      },
      methods: {
       // 图片选择后 保存在 diaLogForm.imgBroadcastList 对象中
       imgBroadcastChange (file, fileList) {
        const isLt2M = file.size / 1024 / 1024 < 2 // 上传头像图片大小不能超过 2MB
        if (!isLt2M) {
         this.diaLogForm.imgBroadcastList = fileList.filter(v => v.uid !== file.uid)
         this.$message.error('图片选择失败,每张图片大小不能超过 2MB,请重新选择!')
        } else {
         this.diaLogForm.imgBroadcastList.push(file)
        }
       },
       // 有图片移除后 触发
       imgBroadcastRemove (file, fileList) {
        this.diaLogForm.imgBroadcastList = fileList
       },
       // 提交弹窗数据
       async submitDialogData () {
        const imgBroadcastListBase64 = []
        console.log('图片转base64开始...')
        // 并发 转码轮播图片list => base64
        const filePromises = this.diaLogForm.imgBroadcastList.map(async file => {
         const response = await uploadImgToBase64(file.raw)
         return response.result.replace(/.*;base64,/, '') // 去掉data:image/jpeg;base64,
        })
        // 按次序输出 base64图片
        for (const textPromise of filePromises) {
         imgBroadcastListBase64.push(await textPromise)
        }
        console.log('图片转base64结束..., ', imgBroadcastListBase64)
        this.diaLogForm.imgsStr = imgBroadcastListBase64.join()
        console.log(this.diaLogForm)
        const res = await addCommodity(this.diaLogForm)       // 发请求提交表单
        if (res.status) {
         this.$message.success('添加商品成功')
         // 一般提交成功后后端会处理,在需要展示商品地方会返回一个图片路径 
        }
       },
      }
     }
    </script>
    

    这样本地图片上传的时候转base64上传就完成了。可是轮播图有可以进行编辑,我们该如何处理呢?一般来说商品增加页面和修改页面可以公用一个组件,那么我们继续在这个页面上修改。

    编辑时我们首先会拉取商品原有数据,进行展示,在进行修改,这时候服务器返回的图片是一个路径 http://xxx.xxx.xxx/abc.jpg 这样,当我们新增一张图片的还是和上面的方法一样转码即可。可是后端说,没有修改的图片也要赚base64转过来,好吧那就做把。这是一个在线链接 图片,不是本地图片,怎么做呢?

    2. 在线图片转base64

    具体步骤

    utils.js 文件添加在线图片转base64的方法,利用canvas

    编辑商品,先拉取原来的商品信息展示到页面

    提交表单之前,区分在线图片还是本地图片进行转码

    utils.js

    export function uploadImgToBase64 (file) {
     return new Promise((resolve, reject) => {
      function getBase64Image (img) {
       const canvas = document.createElement('canvas')
       canvas.width = img.width
       canvas.height = img.height
       const ctx = canvas.getContext('2d')
       ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
       var dataURL = canvas.toDataURL()
       return dataURL
      }
     
      const image = new Image()
      image.crossOrigin = '*' // 允许跨域图片
      image.src = img + '?v=' + Math.random() // 清除图片缓存
      console.log(img)
      image.onload = function () {
       resolve(getBase64Image(image))
      }
      image.onerror = reject
     })
    }
    

    添加商品页面 部分代码

    <template>
     <div>
       <el-upload
        ref="imgBroadcastUpload"
        :auto-upload="false" multiple
        :file-list="diaLogForm.imgBroadcastList"
        list-type="picture-card"
        :on-change="imgBroadcastChange"
        :on-remove="imgBroadcastRemove"
        accept="image/jpg,image/png,image/jpeg"
        action="">
        <i class="el-icon-plus"></i>
        <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过2M</div>
       </el-upload>
       <el-button>submitData</el-button> 
     </div>
    </template>
     
    <script>
      import { uploadImgToBase64, URLImgToBase64 } from '@/utils'
       
     export default {
      name: 'imgUpload',
      data () {
       return {
        diaLogForm: {
          goodsName:'', // 商品名称字段
          imgBroadcastList:[], // 储存选中的图片列表
          imgsStr:''   // 后端需要的多张图base64字符串 , 分割
        }
       }
      },
      created(){
        this.getGoodsData()
      },
      methods: {
       // 图片选择后 保存在 diaLogForm.imgBroadcastList 对象中
       imgBroadcastChange (file, fileList) {
        const isLt2M = file.size / 1024 / 1024 < 2 // 上传头像图片大小不能超过 2MB
        if (!isLt2M) {
         this.diaLogForm.imgBroadcastList = fileList.filter(v => v.uid !== file.uid)
         this.$message.error('图片选择失败,每张图片大小不能超过 2MB,请重新选择!')
        } else {
         this.diaLogForm.imgBroadcastList.push(file)
        }
       },
       // 有图片移除后 触发
       imgBroadcastRemove (file, fileList) {
        this.diaLogForm.imgBroadcastList = fileList
       },
       // 获取商品原有信息
       getGoodsData () {
        getCommodityById({ cid: this.diaLogForm.id }).then(res => {
         if (res.status) {
          Object.assign(this.diaLogForm, res.data)
          // 把 '1.jpg,2.jpg,3.jpg' 转成[{url:'http://xxx.xxx.xx/j.jpg',...}] 这种格式在upload组件内展示。 imgBroadcastList 展示原有的图片
          this.diaLogForm.imgBroadcastList = this.diaLogForm.imgsStr.split(',').map(v => ({ url: this.BASE_URL + '/' + v })) 
         }
        }).catch(err => {
         console.log(err.data)
        })
       },
       // 提交弹窗数据
       async submitDialogData () {
        const imgBroadcastListBase64 = []
        console.log('图片转base64开始...')
        this.dialogFormLoading = true
        // 并发 转码轮播图片list => base64
        const filePromises = this.diaLogForm.imgBroadcastList.map(async file => {
         if (file.raw) { // 如果是本地文件
          const response = await uploadImgToBase64(file.raw)
          return response.result.replace(/.*;base64,/, '')
         } else { // 如果是在线文件
          const response = await URLImgToBase64(file.url)
          return response.replace(/.*;base64,/, '')
         }
        })
        // 按次序输出 base64图片
        for (const textPromise of filePromises) {
         imgBroadcastListBase64.push(await textPromise)
        }
        console.log('图片转base64结束...')
        this.diaLogForm.imgs = imgBroadcastListBase64.join()
        console.log(this.diaLogForm)
        if (!this.isEdit) { // 新增编辑 公用一个组件。区分接口调用
         const res = await addCommodity(this.diaLogForm)       // 提交表单
         if (res.status) {
          this.$message.success('添加成功')
         }
        } else {
         const res = await modifyCommodity(this.diaLogForm)      // 提交表单
         if (res.status) {
          this.$router.push('/goods/goods-list')
          this.$message.success('编辑成功')
         }
        }
       }
      }
     }
    </script>
    

    结语

    至此常用的三种图片上传方式就介绍完了,转base64方式一般在小型项目中使用,大文件上传还是传统的 formdata或者 云服务,更合适。但是 通过转base64方式也使得,在前端进行图片编辑成为了可能,不需要上传到服务器就能预览。主要收获还是对于异步操作的处理。
    最后

    为了帮助大家让学习变得轻松、高效,给大家免费分享一大批资料,帮助大家在成为全栈工程师,乃至架构师的路上披荆斩棘。在这里给大家推荐一个前端全栈学习交流圈:866109386.欢迎大家进群交流讨论,学习交流,共同进步。

    当真正开始学习的时候难免不知道从哪入手,导致效率低下影响继续学习的信心。

    但最重要的是不知道哪些技术需要重点掌握,学习时频繁踩坑,最终浪费大量时间,所以有有效资源还是很有必要的。

    最后祝福所有遇到瓶疾且不知道怎么办的前端程序员们,祝福大家在往后的工作与面试中一切顺利。

    项目中需要上传图片可谓是经常遇到的需求,本文将介绍 3 种不同的图片上传方式,在这总结分享一下,有什么建议或者意见,请大家踊跃提出来。

    没有业务场景的功能都是耍流氓,那么我们先来模拟一个需要实现的业务场景。假设我们要做一个后台系统添加商品的页面,有一些商品名称、信息等字段,还有需要上传商品轮播图的需求。

    我们就以Vue、Element-ui,封装组件为例子聊聊如何实现这个功能。其他框架或者不用框架实现的思路都差不多,本文主要聊聊实现思路。

    1.云储存

    常见的 七牛云,OSS(阿里云)等,这些云平台提供API接口,调用相应的接口,文件上传后会返回图片存储在服务器上的路径,前端获得这个路径保存下来提交给后端即可。此流程处理相对简单。

    主要步骤

    • 向后端发送请求,获取OSS配置数据
    • 文件上传,调用OSS提供接口
    • 文件上传完成,后的文件存储在服务器上的路径
    • 将返回的路径存值到表单对象中

    代码范例

    我们以阿里的 OSS 服务来实现,们试着来封装一个OSS的图片上传组件。

    通过element-ui的upLoad组件的 http-request 参数来自定义我们的文件上传,仅仅使用他组件的样式,和其他上传前的相关钩子(控制图片大小,上传数量限制等)。

    <template>
     <el-upload
      list-type="picture-card"
      action="''"
      :http-request="upload"
      :before-upload="beforeAvatarUpload">
      <i class="el-icon-plus"></i>
     </el-upload>
    </template>
     
    <script>
     import {getAliOSSCreds} from '@/api/common' // 向后端获取 OSS秘钥信息
     import {createId} from '@/utils' // 一个生产唯一的id的方法
     import OSS from 'ali-oss'
     
     export default {
      name: 'imgUpload',
      data () {
       return {}
      },
      methods: {
       // 图片上传前验证
       beforeAvatarUpload (file) {
        const isLt2M = file.size / 1024 / 1024 < 2
        if (!isLt2M) {
         this.$message.error('上传头像图片大小不能超过 2MB!')
        }
        return isLt2M
       },
       // 上传图片到OSS 同时派发一个事件给父组件监听
       upload (item) {
        getAliOSSCreds().then(res => { // 向后台发请求 拉取OSS相关配置
         let creds = res.body.data
         let client = new OSS.Wrapper({
          region: 'oss-cn-beijing', // 服务器集群地区
          accessKeyId: creds.accessKeyId, // OSS帐号
          accessKeySecret: creds.accessKeySecret, // OSS 密码
          stsToken: creds.securityToken, // 签名token
          bucket: 'imgXXXX' // 阿里云上存储的 Bucket
         })
         let key = 'resource/' + localStorage.userId + '/images/' + createId() + '.jpg' // 存储路径,并且给图片改成唯一名字
         return client.put(key, item.file) // OSS上传
        }).then(res => {
         console.log(res.url)
         this.$emit('on-success', res.url) // 返回图片的存储路径
        }).catch(err => {
         console.log(err)
        })
       }
      }
     }
    </script>
    

    传统文件服务器上传图片

    此方法就是上传到自己文件服务器硬盘上,或者云主机的硬盘上,都是通过 formdata 的方式进行文件上传。具体的思路和云文件服务器差不多。

    主要步骤

    • 设置服务器上传路径、上传文件字段名、header、data参数等
    • 上传成功后,返回服务器存储的路径
    • 返回的图片路径存储到表单提交对象中

    代码示例

    此种图片上传根据element-ui的upLoad组件只要传入后端约定的相关字段即可实现,若使用元素js也是生成formdata对象,通过Ajax去实现上传也是类似的。

    这里只做一个简单的示例,具体请看el-upload组件相文档就能实现

    <template>
     <el-upload
      ref="imgUpload"
      :on-success="imgSuccess"
      :on-remove="imgRemove"
      accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"
      :headers="headerMsg"
      :action="upLoadUrl"
      multiple>
      <el-button type="primary">上传图片</el-button>
     </el-upload>
    </template>
     
    <script>
     import {getAliOSSCreds} from '@/api/common' // 向后端获取 OSS秘钥信息
     import {createId} from '@/utils' // 一个生产唯一的id的方法
     import OSS from 'ali-oss'
     
     export default {
      name: 'imgUpload',
      data () {
       return {
         headerMsg:{Token:'XXXXXX'},
         upLoadUrl:'xxxxxxxxxx'
       }
      },
      methods: {
       // 上传图片成功
       imgSuccess (res, file, fileList) {
        console.log(res)
        console.log(file)
        console.log(fileList)  // 这里可以获得上传成功的相关信息
       }
      }
     }
    </script>
    

    图片转 base64 后上传

    有时候做一些私活项目,或者一些小图片上传可能会采取前端转base64后成为字符串上传。当我们有这一个需求,有一个商品轮播图多张,转base64编码后去掉data:image/jpeg;base64,将字符串以逗号的形势拼接,传给后端。我们如何来实现呢。

    1.本地文件如何转成 base64

    我们通过H5新特性 readAsDataURL 可以将文件转base64格式,轮播图有多张,可以在点击后立马转base64也可,我是在提交整个表单钱一次进行转码加工。

    具体步骤

    • 新建文件封装 异步 转base64的方法
    • 添加商品的时候选择本地文件,选中用对象保存整个file对象
    • 最后提交整个商品表单之前进行编码处理

    在这里要注意一下,因为 readAsDataURL 操作是异步的,我们如何将存在数组中的若干的 file对象,进行编码,并且按照上传的顺序,把编码后端图片base64字符串储存在一个新数组内呢,首先想到的是promise的链式调用,可是不能并发进行转码,有点浪费时间。我们可以通过循环 async 函数进行并发,并且排列顺序。请看 methods 的 submitData 方法

    utils.js

    export function uploadImgToBase64 (file) {
     return new Promise((resolve, reject) => {
      const reader = new FileReader()
      reader.readAsDataURL(file)
      reader.onload = function () { // 图片转base64完成后返回reader对象
       resolve(reader)
      }
      reader.onerror = reject
     })
    }
    

    添加商品页面 部分代码

    <template>
     <div>
       <el-upload
        ref="imgBroadcastUpload"
        :auto-upload="false" multiple
        :file-list="diaLogForm.imgBroadcastList"
        list-type="picture-card"
        :on-change="imgBroadcastChange"
        :on-remove="imgBroadcastRemove"
        accept="image/jpg,image/png,image/jpeg"
        action="">
        <i class="el-icon-plus"></i>
        <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过2M</div>
       </el-upload>
       <el-button>submitData</el-button> 
     </div>
    </template>
     
    <script>
     import { uploadImgToBase64 } from '@/utils' // 导入本地图片转base64的方法
     
     export default {
      name: 'imgUpload',
      data () {
       return {
        diaLogForm: {
          goodsName:'', // 商品名称字段
          imgBroadcastList:[], // 储存选中的图片列表
          imgsStr:''   // 后端需要的多张图base64字符串 , 分割
        }
       }
      },
      methods: {
       // 图片选择后 保存在 diaLogForm.imgBroadcastList 对象中
       imgBroadcastChange (file, fileList) {
        const isLt2M = file.size / 1024 / 1024 < 2 // 上传头像图片大小不能超过 2MB
        if (!isLt2M) {
         this.diaLogForm.imgBroadcastList = fileList.filter(v => v.uid !== file.uid)
         this.$message.error('图片选择失败,每张图片大小不能超过 2MB,请重新选择!')
        } else {
         this.diaLogForm.imgBroadcastList.push(file)
        }
       },
       // 有图片移除后 触发
       imgBroadcastRemove (file, fileList) {
        this.diaLogForm.imgBroadcastList = fileList
       },
       // 提交弹窗数据
       async submitDialogData () {
        const imgBroadcastListBase64 = []
        console.log('图片转base64开始...')
        // 并发 转码轮播图片list => base64
        const filePromises = this.diaLogForm.imgBroadcastList.map(async file => {
         const response = await uploadImgToBase64(file.raw)
         return response.result.replace(/.*;base64,/, '') // 去掉data:image/jpeg;base64,
        })
        // 按次序输出 base64图片
        for (const textPromise of filePromises) {
         imgBroadcastListBase64.push(await textPromise)
        }
        console.log('图片转base64结束..., ', imgBroadcastListBase64)
        this.diaLogForm.imgsStr = imgBroadcastListBase64.join()
        console.log(this.diaLogForm)
        const res = await addCommodity(this.diaLogForm)       // 发请求提交表单
        if (res.status) {
         this.$message.success('添加商品成功')
         // 一般提交成功后后端会处理,在需要展示商品地方会返回一个图片路径 
        }
       },
      }
     }
    </script>
    

    这样本地图片上传的时候转base64上传就完成了。可是轮播图有可以进行编辑,我们该如何处理呢?一般来说商品增加页面和修改页面可以公用一个组件,那么我们继续在这个页面上修改。

    编辑时我们首先会拉取商品原有数据,进行展示,在进行修改,这时候服务器返回的图片是一个路径 http://xxx.xxx.xxx/abc.jpg 这样,当我们新增一张图片的还是和上面的方法一样转码即可。可是后端说,没有修改的图片也要赚base64转过来,好吧那就做把。这是一个在线链接 图片,不是本地图片,怎么做呢?

    2. 在线图片转base64

    具体步骤

    utils.js 文件添加在线图片转base64的方法,利用canvas

    编辑商品,先拉取原来的商品信息展示到页面

    提交表单之前,区分在线图片还是本地图片进行转码

    utils.js

    export function uploadImgToBase64 (file) {
     return new Promise((resolve, reject) => {
      function getBase64Image (img) {
       const canvas = document.createElement('canvas')
       canvas.width = img.width
       canvas.height = img.height
       const ctx = canvas.getContext('2d')
       ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
       var dataURL = canvas.toDataURL()
       return dataURL
      }
     
      const image = new Image()
      image.crossOrigin = '*' // 允许跨域图片
      image.src = img + '?v=' + Math.random() // 清除图片缓存
      console.log(img)
      image.onload = function () {
       resolve(getBase64Image(image))
      }
      image.onerror = reject
     })
    }
    

    添加商品页面 部分代码

    <template>
     <div>
       <el-upload
        ref="imgBroadcastUpload"
        :auto-upload="false" multiple
        :file-list="diaLogForm.imgBroadcastList"
        list-type="picture-card"
        :on-change="imgBroadcastChange"
        :on-remove="imgBroadcastRemove"
        accept="image/jpg,image/png,image/jpeg"
        action="">
        <i class="el-icon-plus"></i>
        <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过2M</div>
       </el-upload>
       <el-button>submitData</el-button> 
     </div>
    </template>
     
    <script>
      import { uploadImgToBase64, URLImgToBase64 } from '@/utils'
       
     export default {
      name: 'imgUpload',
      data () {
       return {
        diaLogForm: {
          goodsName:'', // 商品名称字段
          imgBroadcastList:[], // 储存选中的图片列表
          imgsStr:''   // 后端需要的多张图base64字符串 , 分割
        }
       }
      },
      created(){
        this.getGoodsData()
      },
      methods: {
       // 图片选择后 保存在 diaLogForm.imgBroadcastList 对象中
       imgBroadcastChange (file, fileList) {
        const isLt2M = file.size / 1024 / 1024 < 2 // 上传头像图片大小不能超过 2MB
        if (!isLt2M) {
         this.diaLogForm.imgBroadcastList = fileList.filter(v => v.uid !== file.uid)
         this.$message.error('图片选择失败,每张图片大小不能超过 2MB,请重新选择!')
        } else {
         this.diaLogForm.imgBroadcastList.push(file)
        }
       },
       // 有图片移除后 触发
       imgBroadcastRemove (file, fileList) {
        this.diaLogForm.imgBroadcastList = fileList
       },
       // 获取商品原有信息
       getGoodsData () {
        getCommodityById({ cid: this.diaLogForm.id }).then(res => {
         if (res.status) {
          Object.assign(this.diaLogForm, res.data)
          // 把 '1.jpg,2.jpg,3.jpg' 转成[{url:'http://xxx.xxx.xx/j.jpg',...}] 这种格式在upload组件内展示。 imgBroadcastList 展示原有的图片
          this.diaLogForm.imgBroadcastList = this.diaLogForm.imgsStr.split(',').map(v => ({ url: this.BASE_URL + '/' + v })) 
         }
        }).catch(err => {
         console.log(err.data)
        })
       },
       // 提交弹窗数据
       async submitDialogData () {
        const imgBroadcastListBase64 = []
        console.log('图片转base64开始...')
        this.dialogFormLoading = true
        // 并发 转码轮播图片list => base64
        const filePromises = this.diaLogForm.imgBroadcastList.map(async file => {
         if (file.raw) { // 如果是本地文件
          const response = await uploadImgToBase64(file.raw)
          return response.result.replace(/.*;base64,/, '')
         } else { // 如果是在线文件
          const response = await URLImgToBase64(file.url)
          return response.replace(/.*;base64,/, '')
         }
        })
        // 按次序输出 base64图片
        for (const textPromise of filePromises) {
         imgBroadcastListBase64.push(await textPromise)
        }
        console.log('图片转base64结束...')
        this.diaLogForm.imgs = imgBroadcastListBase64.join()
        console.log(this.diaLogForm)
        if (!this.isEdit) { // 新增编辑 公用一个组件。区分接口调用
         const res = await addCommodity(this.diaLogForm)       // 提交表单
         if (res.status) {
          this.$message.success('添加成功')
         }
        } else {
         const res = await modifyCommodity(this.diaLogForm)      // 提交表单
         if (res.status) {
          this.$router.push('/goods/goods-list')
          this.$message.success('编辑成功')
         }
        }
       }
      }
     }
    </script>
    

    结语

    至此常用的三种图片上传方式就介绍完了,转base64方式一般在小型项目中使用,大文件上传还是传统的 formdata或者 云服务,更合适。但是 通过转base64方式也使得,在前端进行图片编辑成为了可能,不需要上传到服务器就能预览。主要收获还是对于异步操作的处理。
    最后

    当真正开始学习的时候难免不知道从哪入手,导致效率低下影响继续学习的信心。

    但最重要的是不知道哪些技术需要重点掌握,学习时频繁踩坑,最终浪费大量时间,所以有有效资源还是很有必要的。

    最后祝福所有遇到瓶疾且不知道怎么办的前端程序员们,祝福大家在往后的工作与面试中一切顺利。

    展开全文
  • 类似于QQ空间、微信朋友圈图片上传、用GridView实现多图选择图片上传。包括服务端代码。这是本人就地取材、所以服务端代码可能有部分不相关。有兴趣的朋友可以自己看看、简洁明了的。
  • JavaScript实现图片上传并预览并提交ajax(完整demo)

    万次阅读 多人点赞 2017-08-04 17:36:28
    图片上传并预览HTML<div class="file-box"> 预览"> ,imag

    图片上传并预览

    2021.03.31更新并附完整demo,点击下载

    在这里插入图片描述



    这里写图片描述

    HTML

    <div class="file-box">
        <img id="preview" />
        <input type="text" id="imgfield" class="txt" placeholder="预览">
        <input type="file" name="file" id = "input_file" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg" οnchange="imgPreview(this)" >	
    </div>
    

    css

    .file-box {
        position: relative;
        display: inline-block;
    }
    .file-box img {
        width: 50px;
        height: 50px;
        border-radius: 50%;
        position: absolute;
        top: -30px;
        left: 0;
        display: inline-block;
        border: none;
    }
    .file-box .txt,.file-box .file {
        width: 70px;
        height: 36px;
        position: absolute;
        top: -20px;
        left: 100px;
        text-align: center;
    }
    

    JS

    function imgPreview(fileDom) {
    	//判断是否支持FileReader
    	if(window.FileReader) {
    		var reader = new FileReader();
    	} else {
    		alert("您的设备不支持图片预览功能,如需该功能请升级您的设备!");
    	}
    	//获取文件
    	var file = fileDom.files[0];
    	var imageType = /^image\//;
    	//是否是图片
    	if(!imageType.test(file.type)) {
    		alert("请选择图片!");
    		return;
    	}
    	//读取完成
    	reader.onload = function(e) {
    		//获取图片dom
    		var img = document.getElementById("preview");
    		//图片路径设置为读取的图片
    		img.src = e.target.result;
    	};
    	reader.readAsDataURL(file);
    }
    

    上传图片提交ajax

    如果想把图片信息通过ajax传给后端,则需要通过new FormData() 上传图片信息,然后使用 append() 方法向该对象里添加字段,具体代码如下:

    (注:以下代码在图片预览成功后执行,也就是在reader.readAsDataURL(file); 后)

    var formData = new FormData(); 
    formData.append('file', $('#input_file')[0].files[0]);  //添加图片信息的参数
    formData.append('sizeid',123);  //添加其他参数
    $.ajax({
        url: '/material/uploadFile',
        type: 'POST',
        cache: false, //上传文件不需要缓存
        data: formData,
        processData: false, // 告诉jQuery不要去处理发送的数据
        contentType: false, // 告诉jQuery不要去设置Content-Type请求头
        success: function (data) {
            var rs = eval("("+data+")");
            if(rs.state==1){
                tipTopShow('上传成功!');
            }else{
                tipTopShow(rs.msg);
            }
        },
        error: function (data) {
            tipTopShow("上传失败");
        }
    })  
    

    这里写图片描述

    展开全文
  • 在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢?   下面说一下我的实现过程(只是个人实现思路,实际网站怎...

    题外话:推荐一个专注于Java开发的网站,做提升学习,价值阅读:Java知音

    同时,扫码关注后端技术精选,回复“学习资料”,领取100套小程序源码+小程序开发视频和基本Java经典书籍电子版


    在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢?

     

    下面说一下我的实现过程(只是个人实现思路,实际网站怎么实现的不太清楚)

    实现的思路:

    工具:MySQL,eclipse

    首先,在MySQL中创建了两个表,一个t_user表,用来存放用户名,密码等个人信息,

    一个t_touxiang表,用来存放上传的图片在服务器中的存放路径,以及图片名字和用户ID,

    T_touxiang表中的用户ID对应了t_user中的id。

     

    t_user表SQL:

    DROP TABLE IF EXISTS `t_user`;
    CREATE TABLE `t_user` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `username` varchar(20) NOT NULL,
      `password` varchar(255) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `username` (`username`)
    ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
    

     

    T_touxiang表SQL:

     

    DROP TABLE IF EXISTS `t_touxiang`;
    CREATE TABLE `t_touxiang` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `image_path` varchar(255) DEFAULT NULL,
      `user_id` int(11) DEFAULT NULL,
      `old_name` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `img_user` (`user_id`),
      CONSTRAINT `img_user` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    

     

    首先,写一个UploadServlet.java,用来处理图片文件的上传,并将图片路径,图片名称等信息存放到t_touxiang数据表中,代码如下:

     

    @WebServlet("/UploadServlet.do")
    public class UploadServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void service(HttpServletRequest request, HttpServletResponse response)
    	    throws ServletException, IOException {
    	// 判断上传表单是否为multipart/form-data类型
    	HttpSession session = request.getSession();
    	User user = (User) session.getAttribute("user"); // 在登录时将 User 对象放入了 会话
    							 // 中
    
    	if (ServletFileUpload.isMultipartContent(request)) {
    
    	    try {
    		// 1. 创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
    		DiskFileItemFactory factory = new DiskFileItemFactory();
    		// System.out.println(System.getProperty("java.io.tmpdir"));//默认临时文件夹
    
    		// 2. 创建ServletFileUpload对象,并设置上传文件的大小限制。
    		ServletFileUpload sfu = new ServletFileUpload(factory);
    		sfu.setSizeMax(10 * 1024 * 1024);// 以byte为单位 不能超过10M 1024byte =
    						 // 1kb 1024kb=1M 1024M = 1G
    		sfu.setHeaderEncoding("utf-8");
    
    		// 3.
    		// 调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
    		@SuppressWarnings("unchecked")
    		List<FileItem> fileItemList = sfu.parseRequest(request);
    		Iterator<FileItem> fileItems = fileItemList.iterator();
    
    		// 4. 遍历list,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件
    		while (fileItems.hasNext()) {
    		    FileItem fileItem = fileItems.next();
    		    // 普通表单元素
    		    if (fileItem.isFormField()) {
    			String name = fileItem.getFieldName();// name属性值
    			String value = fileItem.getString("utf-8");// name对应的value值
    
    			System.out.println(name + " = " + value);
    		    }
    		    // <input type="file">的上传文件的元素
    		    else {
    			String fileName = fileItem.getName();// 文件名称
    			System.out.println("原文件名:" + fileName);// Koala.jpg
    
    			String suffix = fileName.substring(fileName.lastIndexOf('.'));
    			System.out.println("扩展名:" + suffix);// .jpg
    
    			// 新文件名(唯一)
    			String newFileName = new Date().getTime() + suffix;
    			System.out.println("新文件名:" + newFileName);// image\1478509873038.jpg
    
    			// 5. 调用FileItem的write()方法,写入文件
    			File file = new File("D:/lindaProjects/mySpace/wendao/WebContent/touxiang/" + newFileName);
    			System.out.println(file.getAbsolutePath());
    			fileItem.write(file);
    
    			// 6. 调用FileItem的delete()方法,删除临时文件
    			fileItem.delete();
    
    			/*
    			 * 存储到数据库时注意 1.保存源文件名称 Koala.jpg 2.保存相对路径
    			 * image/1478509873038.jpg
    			 * 
    			 */
    			if (user != null) {
    			    int myid = user.getId();
    			    String SQL = "INSERT INTO t_touxiang(image_path,user_id,old_name)VALUES(?,?,?)";
    			    int rows = JdbcHelper.insert(SQL, false, "touxiang/" + newFileName, myid, fileName);
    			    if (rows > 0) {
    				session.setAttribute("image_name", fileName);
    				session.setAttribute("image_path", "touxiang/" + newFileName);
    				response.sendRedirect(request.getContextPath() + "/upImage.html");
    			    } else {
    
    			    }
    
    			} else {
    			    session.setAttribute("loginFail", "请登录");
    			    response.sendRedirect(request.getContextPath() + "/login.html");
    			}
    
    		    }
    		}
    
    	    } catch (FileUploadException e) {
    		e.printStackTrace();
    	    } catch (Exception e) {
    		e.printStackTrace();
    	    }
    
    	}
        }
    }
    

     

    在完成图片上传并写入数据库的同时,将图片路径通过session的方式发送到HTML界面

     

     

    <!DOCTYPE html>
    
    <html>
    
    <head>
    
    <meta charset="UTF-8">
    
    <title>更换头像</title>
    
    </head>
    
    <body>
    
             <formaction="UploadServlet.do" method="post"enctype="multipart/form-data">
    
                         本地目录:<inputtype="file" name="uploadFile">
    
               <img src="${image_path}" width="200" height="200">
    
                    <inputtype="submit" value="上传头像"/>
    
       </form>
    
    </body>
    
    </html>

     

    至此,图片上传数据库和本地服务器已经实现,那么如何在HTML界面显示出个人信息以及上传的头像呢?

     

     

    首先定义一个PersonServlet类,用来读取数据库的内容,并发送到HTML界面。

    代码如下:

    @WebServlet("/persons.do")
    public class PersonServlet extends HttpServlet {
    
        private static final long serialVersionUID = -800352785988546254L;
    
        protected void service(HttpServletRequest request, HttpServletResponse response)
    	    throws ServletException, IOException {
    	// 判断上传表单是否为multipart/form-data类型
    	Touxiang tx=null;
    	
    	HttpSession session = request.getSession();
    	User user = (User) session.getAttribute("user"); // 在登录时将 User 对象放入了 会话
    	if(user!=null){
    	    int myid=user.getId();
    	    String SQL="SELECT id,image_path,old_name FROM t_touxiang WHERE user_id=?";
    	    ResultSet rs=JdbcHelper.query(SQL,myid);
    	    String uSQL="SELECT username,password FROM t_user WHERE id=?";
    	    ResultSet urs=JdbcHelper.query(uSQL,myid);
    	    System.out.println( "我的个人id是: " + myid);
    	    final List<Touxiang> touxiang=new ArrayList<>();
    	    try {
    		if(rs.next())
    		{
    		    tx=new Touxiang();
    		    tx.setId(rs.getInt(1));
    		    tx.setImage_path(rs.getString(2));
    		    tx.setOld_name(rs.getString(3));
    		    touxiang.add(tx);
    		}
    		if(urs.next()){
    		    user.setUsername(urs.getString(1));
    		    user.setPassword(urs.getString(2));
    		    user.setTouxiang(touxiang);
    		}
    		
    	    } catch (SQLException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	    }
    	   
    		session.setAttribute("user", user);
    		System.out.println( "我的id: " + myid);
    		response.sendRedirect( request.getContextPath() + "/person.html");
    	}
        }
    }
    

     

    在HTML界面接收信息,并显示出来,代码如下:

     

    <div>
    	<form action="UploadServlet.do" method="post" enctype="multipart/form-data">
          		 <div><a href="$path/upImage.html">更换头像</a></div>
            	
            	#foreach( $ut in  $user.getTouxiang() )
            	 <img src=" $ut.getImage_path()"  width="200" height="200">
            	 #end
            	 <div>我的头像:</div>
            	 <div>我的姓名:$user.getUsername()</div>
            	 <div><a href="$path/myAnswer.do">我的解答</a></div>
    		<div><a href="$path/myQuestion.do">我的提问</a></div>
       	 </form>
    	</div>
    <div>
    	<form action="UploadServlet.do" method="post" enctype="multipart/form-data">
          		 <div><a href="$path/upImage.html">更换头像</a></div>
            	
            	#foreach( $ut in  $user.getTouxiang() )
            	 <img src=" $ut.getImage_path()"  width="200" height="200">
            	 #end
            	 <div>我的头像:</div>
            	 <div>我的姓名:$user.getUsername()</div>
            	 <div><a href="$path/myAnswer.do">我的解答</a></div>
    		<div><a href="$path/myQuestion.do">我的提问</a></div>
       	 </form>
    	</div>

     

    至此,一个基于Java的头像上传服务器,路径存储在MySQL,并在HTML界面读取出来的功能就基本实现了。头像上传之前进行处理等操作,可以选择一些插件来完成。这里只是简单的实现了基本功能。

     

     

    补充

    对于图片上传,这里只是简单的用Servlet实现了一下最基本的功能,仅提供思路。如果使用spring等框架,他都对图片上传做了很好的封装,应该更加容易。

    后台实现图片上传应该来说比较容易,但是比较头疼的是图片上传原生的按钮丑出天际,这里推荐俩实用的上传控件,应该算比较好看。

     

    1,H5实现的图片上传,可多张上传,可点击可拖拽上传,大概是这个样子:

    基本的使用介绍和下载地址:http://blog.csdn.net/weixin_36380516/article/details/70352689

     

    2,jQuery图像裁剪插件,大概长这样

     

    不仅提供上传,还有裁剪等功能,UI做的也美,

    地址:http://www.jq22.com/jquery-info318

     

    展开全文
  • Layui框架实现图片上传

    万次阅读 多人点赞 2019-08-02 17:05:47
    Layui框架实现图片上传 前言: 一直以来,图片上传总是件很麻烦的事。最近在学layui,发现layui真是极大简化了各种复杂的操作,避免了繁琐的开发。 layui图片上传和传统的图片上传不同,它并不予表单元素并存,而是...
  • 之前做过一个项目,有一个功能是图片上传并且展示图片,尝试过其他的方法,但会有一个问题,那就是在IE8上图片并不能正常展示,所以便用以下方法来上传图片,很好的解决了此问题,步骤如下: 1.上传图片页面index....
  • springmvc上传图片并显示图片--支持多图片上传

    万次阅读 多人点赞 2015-07-13 21:44:23
    springmvc上传图片并显示图片(也能上传文件),多图片上传并显示图片,采用commons-fileupload,commons-io
  • App图片上传Base64图片上传

    千次阅读 2018-05-04 18:36:42
    * @Method base64图片上传 * @author Angus * return array * date 2018-05-04 */ function saveBase64Image($base64_image_content){ if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_imag...
  • mpvue图片上传

    千次阅读 2018-10-17 14:25:34
    mpvue小程序项目中的图片上传 效果图 通过mpvue文档得知他使用的是小程序原生api中的图片选择(wx.chooseImage)和文件上传(wx.uploadFile),因此我们直接根据小程序的文档来使用就可以了。 chooseImage文档 ...
  • vue图片上传

    千次阅读 2018-08-14 17:21:38
    图片上传是以表单的形式提交,vue上传图片步骤如下: 1、绑定input框上传事件change &lt;input type="file" @change="uploadFile($event)" multiple="multiple" /&gt; 2...
  • Simditor图片上传源码

    热门讨论 2014-11-12 16:18:02
    介绍Simditor使用方法及图片上传。并结合bootstrap和syntaxhighlighter演示如何使用。
  • 七牛图片上传demo

    热门讨论 2015-04-21 16:43:40
    七牛图片上传demo,需自己获取token
  • HTML5 Plus 拍照或者相册选择图片上传

    万次阅读 多人点赞 2016-07-13 14:34:57
    HBuilder+HTML5 Plus+MUI实现拍照或者相册选择图片上传,利用HTML5 Plus的Camera、Gallery、IO、Storage和Uploader来实现手机APP拍照或者从相册选择图片上传。Camera模块管理设备的摄像头,可用于拍照、摄像操作,...
  • 图片上传并预览

    万次阅读 2018-08-05 09:23:00
    标签,在图片上传之后,用新图片的src替换原来&lt;img/&gt;标签中的src。 如下图所示,是原始的按钮样式: 美化步骤: (1)将上传图片标签采用绝对定位,使之位于一个图片,按钮,div等标签上。或者给...
  • 发布一个图片上传插件,带图片上传后生成预览图片 插件代码: /** * zx-upload.js v1.0.0 * 上传插件 * http://www.*.com/ * * Copyright 2018-2028 zxhj963 * * Released on: 2018/7/21 */ ; ...
  • ElementUI图片上传 回显

    千次阅读 2019-03-18 17:31:59
    html内容 <!-- 图片上传 --> <el-row> <el-col :span="24"> <el-form-item label="LOGO" prop="logoImg"> <el-upload class="up...
  • Typora使用技巧之插入图片及图片上传

    千次阅读 多人点赞 2021-01-17 16:20:10
    文章目录如何在 Typora 中插入图片直接写 Markdown拖拽图片从剪贴板中粘贴图片插入图片时做的动作上传图片配置图片上传服务iPicuPicPicGo-Core(命令行应用)安装预编译好的 PicGo-Core 二进制程序通过 Node.js 包...
  • VUE2.0 图片上传功能(移动端)

    万次阅读 热门讨论 2018-05-25 14:03:44
    本文主要介绍VUE2.0图片上传功能的实现。原理是通过js控制和input标签的方式完成这一效果,无需加载其他组件。 效果图如下: 1.DOM代码 1.1input标签 由于我们是通过input标签的方式进行图片上传的,但是...
  • Vue +Element UI 图片上传控件使用

    万次阅读 多人点赞 2018-07-11 16:34:12
    上一篇 Vue +Element UI +vue-quill-editor 富文本编辑器及插入图片自定义主要是写了富文本编辑器的自定义及编辑器中图片的上传并插入到编辑内容,这篇文章单独介绍一下element UI 图片上传控件的使用。首先要安装...
  • vue 图片上传组件

    千次阅读 2017-11-06 21:34:11
    vue图片上传组件 vue图片上传组件,实现批量上传和单张上传功能,控制图片大小,数量,以及压缩处理,利用了mint-ui的提示框 监听两个参数,分别是MAX控制最多上传的数量,multiple控制是否批量上传,self.$emit...
  • 安卓图片上传服务端+客户端

    热门讨论 2015-05-19 09:32:40
    安卓图片上传,服务端servlet+客户端...
  • java多图片上传功能的实现

    万次阅读 2017-03-06 16:34:25
    用到了maven工具(maven的包百度下就可以)第一步、先在Spring中对图片进行限制<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> <bean id="multipartResolver" class="...
  • vue 图片上传功能

    万次阅读 热门讨论 2018-01-10 10:38:27
    这次做了vue页面的图片上传功能,不带裁剪功能的! 首先是html代码,在input框上添加change事件,如下: 0" v-for='(item ,index ) in imgs'> =6 ? false : true">
  • s3 实现图片上传并返回图片路径

    千次阅读 2019-04-18 14:19:55
    一般做图片上传的的业务时我们接收的都是 MultipartFile 类型的文件 但是s3提供的图片上传只支持file 类型的文件上传,所以需要我先把MultipartFile 转换为 file /** * MultipartFile 转换为file * * @...
  • element ui图片上传-实现单图上传

    万次阅读 2019-05-06 13:19:50
    业务需求,需要把多图上传的效果改造...第一步:改造element ui upload的组件,value的值接收上传回来的图片路径,当value不存在的时候会显示图片上传插件 第二步:当获得图片路径的时候,value有值得时候,显示该...
  • Java图片上传

    万次阅读 2015-05-15 17:46:40
    图片上传,其实,也可以按照之前文章——文件上传的方式实现,因为图片也是文件。只要是文件,都可以用流来接收,然后把流给写出到指定的物理空间下,形成我们需要的物理文件。 今天,我们就不用上传文件的方式,...
  • 微信小程序 -- 图片上传

    万次阅读 2020-07-06 15:31:34
    微信小程序图片上传 老方法,复制粘贴就好使 WXML代码: <text class="name_font name">图片<text>:</text></text> <view class="img name"> <view class="list_tupian weui-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 542,445
精华内容 216,978
关键字:

图片上传