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 $.each的用法说明
Mar 22 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
Dec 12 Javascript
js判断手机和pc端选择不同执行事件的方法
Jan 30 Javascript
javascript匀速运动实现方法分析
Jan 08 Javascript
最全的Javascript编码规范(推荐)
Jun 22 Javascript
基于jQuery实现表格的查看修改删除
Aug 01 Javascript
Angular.js中用ng-repeat-start实现自定义显示
Oct 18 Javascript
JavaScript使用ZeroClipboard操作剪切板
May 10 Javascript
Ionic + Angular.js实现图片轮播的方法示例
May 21 Javascript
JS实现从对象获取对象中单个键值的方法示例
Jun 05 Javascript
vue-simple-uploader上传成功之后的response获取代码
Sep 07 Javascript
Vue如何实现验证码输入交互
Dec 07 Vue.js
浅谈关于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
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
nodejs实现聊天机器人功能
2019/09/19 NodeJs
vue使用echarts画组织结构图
2021/02/06 Vue.js
一起深入理解js中的事件对象
2021/02/06 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
Python带动态参数功能的sqlite工具类
2018/05/26 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
.NET面试问题集
2015/12/08 面试题
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
简单的大学生自我鉴定
2014/02/18 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书