图片预览与上传

小鱼儿 2022-04-24 10:50 698阅读 0赞

小编推荐:Fundebug提供JS错误监控、微信小程序错误监控、微信小游戏错误监控,Node.j错误监控和Java错误监控。真的是一个很好用的错误监控费服务,众多大佬公司都在使用。

1.图片预览

Ⅰ.转成临时url的方式






























NO. 步骤
1 要有type=”file”的input才可以选择图片
2 用于预览效果的img
3 上传图片后,显示预览,写一个事件(某些操作后再做一些事) 利用onchange值改变事件
4 将拿到的图片文件转成临时的url
5 将临时url赋值给img的src属性
  1. <body>
  2. <!-- 要有type="file"的input才可以选择图片 -->
  3. <!-- 加multiple可以支持多选 -->
  4. <input type="file" id="file" multiple>
  5. <!-- 用于预览效果的img -->
  6. <img src="" alt="" id="icon">
  7. <script>
  8. //获取图片预览元素
  9. var icon = document.getElementById('icon')
  10. //上传图片后,显示预览,写一个事件(某些操作后再做一些事) 利用onchange值改变事件
  11. document.getElementById('file').onchange = function(){
  12. //首先想办法拿到你选择的那张图片
  13. //file元素有一个属性叫files,它是一个数组(为了支持多选管理),里面保存了你刚刚选择的那个图片/文件
  14. console.log(this.files[0]);
  15. //将文件转成URL的方案
  16. //Ⅰ.转成临时URL:URL.createObjectURL(文件),临时URL会在页面关闭后失效
  17. //Ⅱ.转成永久URL:选择文件后发ajax请求服务器→服务器把图片保存起来,再返回图片的永久路径
  18. // 临时URL方案
  19. var url = URL.createObjectURL(this.files[0]);
  20. console.log(url);
  21. icon.src = url;
  22. }
  23. </script>
  24. </body>

Ⅱ.转成永久url的方式,引入ajax2.0,详情看代码注释!






























NO. 步骤
1 要有type=”file”的input才可以选择图片
2 用于预览效果的img
3 上传图片后,显示预览,写一个事件(某些操作后再做一些事) 利用onchange值改变事件
4 将拿到的图片文件发送给服务器存储起来,再返回图片永久url
5 将永久url赋值给img的src属性

以下代码需要配合php和apache才能运行

  1. <!-- 要有type="file"的input才可以选择图片 -->
  2. <!-- 加multiple可以支持多选 -->
  3. <input type="file" id="file" multiple>
  4. <!-- 用于预览效果的img -->
  5. <img src="" alt="" id="icon">
  6. <script>
  7. //获取图片预览元素
  8. var icon = document.getElementById('icon')
  9. //上传图片后,显示预览,写一个事件(某些操作后再做一些事) 利用onchange值改变事件
  10. document.getElementById('file').onchange = function(){
  11. //1.上传图片发送给服务器,以前学的ajax不能异步上传文件,只能提交字符串形式
  12. //2.最早上传文件只能用表单来进行,但是表单会有跳转页面的缺点
  13. //由于上述的两点引入了ajax2.0,用FormData对象可以异步上传文件
  14. var xhr = new XMLHttpRequest();
  15. xhr.open('post',uploadPic.php);
  16. //ajax2.0使用步骤
  17. //Ⅰ.创建FormData对象
  18. var fm = new FormData();
  19. //Ⅱ.调用对象的append方法,添加要给服务器提交的文件
  20. //参数1:键,参数2:值
  21. //键的作用:就是让服务器通过这个键获取你的值
  22. fm.append('icon',this.files[0]);
  23. //Ⅲ.send里传递FormData对象就行了
  24. //FormData会自动设置请求头,不用再设置
  25. console.log(fm);
  26. xhr.send(fm);
  27. xhr.onload = function(){
  28. icon.src = xhr.responseText;
  29. }
  30. }
  31. </script>

2.图片(文件)上传:以前都是用表单上传文件,但是页面会跳转,现在有了ajax2.0

Ⅰ.原生js运用ajax2.0

  1. <body>
  2. <form action="">
  3. <input type="text" placeholder="请输入姓名" name="name">
  4. <input type="text" placeholder="请输入年龄" name="age">
  5. <input type="text" placeholder="请输入职业" name="job">
  6. <input type="text" placeholder="请输入薪资" name="salary">
  7. <input type="file" name="icon">
  8. </form>
  9. <input type="button" id="btn" value="点我收集数据并ajax提交给服务器">
  10. <script>
  11. //找到表单
  12. var form = document.querySelector('form');
  13. //找到所有的input
  14. var input = document.getElementsByTagName('input')
  15. document.getElementById('btn').onclick = function(){
  16. //创建请求对象
  17. var xhr = new XMLHttpRequest();
  18. //设置请求行
  19. xhr.open('post','data.php')
  20. //创建FormData对象
  21. var fm = new FormData();
  22. // 方法一:键值对一一对应添加
  23. //这种方法太low
  24. // fm.append('name',input[0].value);
  25. // fm.append('age',input[1].value);
  26. // fm.append('job',input[2].value)
  27. // fm.append('salary',input[3].value)
  28. // fm.append('icon',input[4].files[0])
  29. //方法二:
  30. //创建FormData对象,并传入表单对象
  31. //如果传入表单对象,会自动找到表单里所有带name属性的表单元素
  32. //name的值作为键,它的内容作为值提交给服务器
  33. //跟jQuery的表单序列化很像,表单序列化拿不到file文件
  34. //注意:这里只能传DOM的表单对象,不能传jQuery对象!
  35. var fm = new FormData(form);
  36. //发送请求
  37. xhr.send(fm);
  38. //监听响应完成事件
  39. xhr.onload = function(){
  40. console.log(xhr.responseText);
  41. }
  42. }
  43. </script>
  44. </body>

Ⅱ.jQuery运用ajax2.0

  1. <body>
  2. <form action="">
  3. <input type="text" placeholder="请输入姓名" name="name">
  4. <input type="text" placeholder="请输入年龄" name="age">
  5. <input type="text" placeholder="请输入职业" name="job">
  6. <input type="text" placeholder="请输入薪资" name="salary">
  7. <input type="file" name="icon">
  8. </form>
  9. <input type="button" id="btn" value="点我收集数据并jQuery的ajax提交给服务器">
  10. <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
  11. <script>
  12. $('#btn').click(function(){
  13. //直接用FormData对象获取表单里的值
  14. var fm = new FormData($('form')[0]);
  15. //底下直接用data:fm会报错
  16. //原因一:jQuery发ajax请求的时候会自动把data的对象转成字符串
  17. //因为fm也是一个对象,jQuery也想把它转成字符串,但转不成功,报错
  18. //解决办法:告诉jQuery,你不用帮我做转换,增加底下这句
  19. //processData:false
  20. //原因二:jQuery会自动帮我们设置请求头,但是Formdata也会设置请求头
  21. //两个一起设置冲突了
  22. //解决办法:告诉jQuery,你不要帮我设置请求头,增加底下这句
  23. //contentType:false
  24. $.ajax({
  25. type:"post",
  26. url:"data.php",
  27. data:fm,
  28. processData:false,
  29. contentType:false,
  30. success:function(obj){
  31. console.log(obj);
  32. }
  33. })
  34. })
  35. </script>
  36. </body>

3.vue中的图片预览与上传

Element-UI中的Upload 上传组件

传送门http://element-cn.eleme.io/#/zh-CN/component/upload,查看用户头像上传

  1. //html代码
  2. <el-form :model="formData" enctype="multipart/form-data">
  3. <el-form-item label="反馈类型" :label-width="formLabelWidth">
  4. <el-select class="selects" v-model="formData.type" placeholder="请选择您的提交类型">
  5. <el-option label="需求" value="需求"></el-option>
  6. <el-option label="缺陷" value="缺陷"></el-option>
  7. </el-select>
  8. </el-form-item>
  9. <el-form-item label="反馈标题" :label-width="formLabelWidth">
  10. <el-input v-model="formData.name" autocomplete="off"></el-input>
  11. </el-form-item>
  12. <el-form-item label="反馈内容" :label-width="formLabelWidth">
  13. <el-input type="textarea" v-model="formData.content" autocomplete="off"></el-input>
  14. </el-form-item>
  15. <el-form-item label="上传照片" :label-width="formLabelWidth">
  16. //action 必选参数,上传的地址
  17. //:show-file-list 是否显示已上传文件列表
  18. //:on-success 文件上传成功时的钩子
  19. //:before-upload 上传文件文件之前的钩子,参数为上传的文件
  20. <el-upload
  21. class="avatar-uploader"
  22. :action="UploadUrl()"
  23. :show-file-list="false"
  24. :on-success="handleAvatarSuccess"
  25. :before-upload="beforeAvatarUpload">
  26. <img v-if="imageUrl" :src="imageUrl" class="avatar">
  27. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  28. </el-upload>
  29. </el-form-item>
  30. </el-form>
  31. //js代码
  32. //data中的数据
  33. data() {
  34. return {
  35. formData: {
  36. name: "",
  37. content: "",
  38. type: "",
  39. icon: ""
  40. },
  41. formLabelWidth: "120px",
  42. imageUrl: ''
  43. };
  44. }
  45. //methods中添加方法
  46. handleAvatarSuccess(res, file) {
  47. //图片预览
  48. this.imageUrl = URL.createObjectURL(file.raw);
  49. //将文件添加给formData对象的icon属性,用于上传
  50. this.formData.icon = file.raw;
  51. }

作者:夜半暖人心
链接:https://www.jianshu.com/p/85b2deaeb0df

发表评论

表情:
评论列表 (有 0 条评论,698人围观)

还没有评论,来说两句吧...

相关阅读

    相关 图片

    > 小编推荐:[Fundebug][]提供JS错误监控、微信小程序错误监控、微信小游戏错误监控,Node.j错误监控和Java错误监控。真的是一个很好用的错误监控费服务,众多大

    相关 一个图片

    一、一个按钮上传文件操作 前台选择文件,只能通过input的file类型的文件选择框操作。但有时却为了界面的美观,要求用按钮来完成。 第一步、隐藏文件选择框 第二步、