vuejs+element-ui+laravel5.4上传文件的示例代码


Posted in Javascript onAugust 12, 2017

前言

之前的文章讲得太多安装了,今天就不说这个了,因为我的项目是前后端分离的,所以基本是分开执行代码逻辑。其中还有跨域问题,主要还是在laravel中添加头信息放行之类的,这里会提一下做法。

element-ui的upload组件

我的vue代码:

<template>
  <el-upload
      :action="uploadAction"
      list-type="picture-card"
      :on-remove="handleRemove"
      :on-success="handleSuccess"
      :before-upload="handleBefore"
      :file-list="files">
    <i class="el-icon-plus"></i>
  </el-upload>
  <el-dialog v-model="dialogVisible" size="tiny">
    <img width="100%" :src="dialogImageUrl" alt="">
  </el-dialog>
</template>

这里说一下 on-preview与on-success都可以拿到服务器的返回路径

其中:action="uploadAction"是服务器接引地址, list-type为限制上传格式

而:on-remove="handleRemove"为移除图片时对应的方法,:before-upload="handleBefore"

为上传前的操作,这里我用于限制上传的数量限制, :file-list="files"上传后数据绑定在这里

这里我是使用:on-success="handleSuccess"来拿服务器的返回数据的

export default {
  data(){
    return {
      files: [],
      uploadAction:'http://服务器地址'
    }
  },
  methods: {
    handleSuccess(response){
      console.log(response)
      this.files = [{name: response.name, url: imgBaseUrl + response.photo}]
    },
    handleBefore(){
      return this.files.length === 1 ? false : true // 只让它上传一张
    },
    handleRemove(file, fileList) {
       console.log(file, fileList)
    }
  }
}

laravel跨域

laravel跨域需要添加一个中间件

在app/Http/middleware下 新建文件Cors.php,输入

namespace App\Http\Middleware;

use Closure;

class Cors
{
  /**
   * Handle an incoming request.
   *
   * @param \Illuminate\Http\Request $request
   * @param \Closure $next
   * @return mixed
   */
  public function handle($request, Closure $next)
  {
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
    header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
    return $next($request);
  }
}

在appHttpKernel.php

添加

protected $routeMiddleware = [
    // some class
    'cors' => \App\Http\Middleware\Cors::class,
  ];

laravel 路由

调用中间件来限制路由,这里用了dingo api,如不清楚请看前面的文章

$api->version('v1', ['middleware' => 'cors'], function (Router $api) {
  $api->post('upfile', 'App\\Api\\V1\\Controllers\\Upload\\UploadFiles@upfile');
}

配置Store

打开config/filesystems.php 找到 disks

'disks' => [

  // 上面还有很多,下面是自己加的
  // 新建一个本地端uploads空间(目录) 用于存储上传的文件
    'uploads' => [

      'driver' => 'local',

      // 文件将上传到storage/app/uploads目录
      'root' => storage_path('app/uploads'),

      // 文件将上传到public/uploads目录 如果需要浏览器直接访问 请设置成这个
      //'root' => public_path('uploads'),
    ],
]

开始上传

新建一个上传Controller, 下面很多判断没有做,自行做吧

AppApiV1ControllersUploadUploadFiles.php

namespace App\Api\V1\Controllers\Upload;


use Dingo\Api\Http\Request;
use Dingo\Api\Exception\StoreResourceFailedException;
use Storage;

class UploadFiles
{
  public function upfile(Request $request) {
    if (!$request->hasFile('file')) {
      return response()->json([], 500, '无法获取上传文件');
    }
    $file = $request->file('file');

    if ($file->isValid()) {
      // 获取文件相关信息
      $originalName = $file->getClientOriginalName(); // 文件原名
      $ext = $file->getClientOriginalExtension();   // 扩展名
      $realPath = $file->getRealPath();  //临时文件的绝对路径
      $type = $file->getClientMimeType();   // image/jpeg

      // 上传文件
      $filename = date('Ymd/His');
      // 使用我们新建的uploads本地存储空间(目录)
      $path = $file->store($filename, 'uploads');
      return response()->json([
        'status_code' => 200,
        'message' => 'success',
        'photo' => $path,
        'name' => $originalName,
      ]);

    } else {
      return response()->json([], 500, '文件未通过验证');
    }
  }
}

到此,已经可以放上全部要用到的代码了,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript代码加载优化方法
Jan 30 Javascript
JavaScript学习笔记(二) js对象
Oct 25 Javascript
用js来获取上传的文件名纯粹是为了美化而用
Oct 23 Javascript
Javascript玩转继承(三)
May 08 Javascript
AngularJS监听路由变化的方法
Mar 07 Javascript
关于javascript获取内联样式与嵌入式样式的实例
Jun 01 Javascript
BootStrap selectpicker后台动态绑定数据的方法
Jul 28 Javascript
label+input实现按钮开关切换效果的实例
Aug 16 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
Dec 09 Javascript
vue+iview+less 实现换肤功能
Aug 17 Javascript
vuex如何重置所有state(可定制)
Jan 17 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
May 07 Javascript
浅谈关于angularJs中使用$.ajax的注意点
Aug 12 #Javascript
详解Vue-Cli 异步加载数据的一些注意点
Aug 12 #Javascript
js模块加载方式浅析
Aug 12 #Javascript
浅谈angular2 组件的生命周期钩子
Aug 12 #Javascript
Node.js pipe实现源码解析
Aug 12 #Javascript
vue实现移动端图片裁剪上传功能
Aug 18 #Javascript
JavaScript实现图片切换效果
Aug 12 #Javascript
You might like
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
对采用动态原型方式无法展示继承机制得思考
2009/12/04 Javascript
ext jquery 简单比较
2010/04/07 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
JS作用域深度解析
2016/12/29 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
Python中IPYTHON入门实例
2015/05/11 Python
python读写配置文件操作示例
2019/07/03 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
python分布式编程实现过程解析
2019/11/08 Python
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
2014/11/11 HTML / CSS
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
美国网上订购鲜花:FTD
2016/09/23 全球购物
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
产品质量承诺书
2014/03/27 职场文书
经典毕业生求职信
2014/07/12 职场文书
二人合伙经营协议书
2014/09/13 职场文书
婚姻出轨保证书
2015/05/08 职场文书
2015年加油站工作总结
2015/05/13 职场文书
小学数学国培研修日志
2015/11/13 职场文书
小学大队委竞选口号
2015/12/25 职场文书
《搭石》教学反思
2016/02/18 职场文书