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 相关文章推荐
jQuery 设置 CSS 属性示例介绍
Jan 16 Javascript
jquery 页面滚动到底部自动加载插件集合
Jan 31 Javascript
JS解析XML文件和XML字符串详解
Apr 17 Javascript
浅析Bootstrip的select控件绑定数据的问题
May 10 Javascript
jQuery each函数源码分析
May 25 Javascript
AngularJs定制样式插入到ueditor中的问题小结
Aug 01 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
Nov 13 Javascript
JS加密插件CryptoJS实现AES加密操作示例
Aug 16 Javascript
详解Angular模板引用变量及其作用域
Nov 23 Javascript
微信小程序简单的canvas裁剪图片功能详解
Jul 12 Javascript
微信小程序开发技巧汇总
Jul 15 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
Feb 08 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 多维数组排序(usort,uasort)
2010/06/30 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
php无限级分类实现方法分析
2016/10/19 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
js left,right,mid函数
2008/06/10 Javascript
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
安全资料员岗位职责
2013/12/14 职场文书
人力资源总监工作说明
2014/03/03 职场文书
创文明城市标语
2014/06/16 职场文书
个人主要事迹材料
2014/08/26 职场文书
公证委托书标准格式
2014/09/11 职场文书
师德师风个人整改措施
2014/10/27 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
关于python类SortedList详解
2021/09/04 Python
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang