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 相关文章推荐
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
Jan 22 Javascript
jquery ready函数源代码研究
Dec 06 Javascript
JavaScript的Module模式编程深入分析
Aug 13 Javascript
jquery Tab效果和动态加载的简单实例
Dec 11 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
Dec 03 Javascript
JS HTML5拖拽上传图片预览
Jul 18 Javascript
AngularJS基础 ng-csp 指令详解
Aug 01 Javascript
浅谈ECMAScript6新特性之let、const
Aug 02 Javascript
Vue项目总结之webpack常规打包优化方案
Jun 06 Javascript
Vue axios 将传递的json数据转为form data的例子
Oct 29 Javascript
JS document文档的简单操作完整示例
Jan 13 Javascript
微信小程序点击view动态添加样式过程解析
Jan 21 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
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
jquery自动填充勾选框即把勾选框打上true
2014/03/24 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
python 模拟登陆163邮箱
2020/12/15 Python
实习教师自我鉴定
2013/09/27 职场文书
运动会通讯稿200字
2014/02/16 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
新闻学专业求职信
2014/07/28 职场文书
无工作证明怎么写
2015/06/15 职场文书
八一建军节主持词
2015/07/01 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python
python分分钟绘制精美地图海报
2022/02/15 Python
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python