1. 程式人生 > >laravel 結合plupload上傳檔案到本地

laravel 結合plupload上傳檔案到本地

首先定義上傳類

class Uploads {
  
  public static function upfiles($files, $path = '', $format_data = false, $add_domain = false) {
    $res = ['errno' => 1, 'errmsg' => '上傳圖片錯誤'];
    $data = [];
    foreach($files as $key => $file) {
      //獲取字尾
      $ext = strtolower($file->extension());
      $exts = ['jpg', 'png', 'gif', 'jpeg', 'mp4', 'avi', '3gp'];
      //判斷後綴是否合法
      if(!in_array($ext, $exts)) {
        $res = ['errno' => 1, 'errmsg' => '請上傳正確的圖片型別,支援jpg, png, gif, jpeg型別'];
        return json_encode($res);
      } else {
        //生成檔名稱
        $filename = time() . str_random(6) . "." . $ext;
        //檔案儲存路徑
        $filepath = 'uploads/';
        if(!empty($path)) {
          $filepath = 'uploads/'. $path .'/';
        }
        if($format_data) {
          $filepath = $filepath . date('Ym') . '/';
        }
        if (!file_exists($filepath)) {
          @mkdir($filepath);
        }
        if($add_domain) {
          $savepath = config('app.url') . $filepath . $filename;
        } else {
          $savepath = $filepath . $filename;
        }
        if ($file->move($filepath, $filename)) {
          $data[] = $savepath;
        }
      }
    }
    $res = ['errno' => 0, 'data' => $data];
    return $res;
  }

  public static function upfile($file, $path = 'images', $format_data = false, $add_domain = false) {
    $res = ['errno' => 1, 'errmsg' => '上傳圖片錯誤'];
    $data = '';
     //獲取字尾
    $ext = strtolower($file->extension());
    //判斷後綴是否合法
    $exts = ['jpg', 'png', 'gif', 'jpeg', 'mp4', 'avi', '3gp'];
    if(!in_array($ext, $exts)) {
      $res = ['errno' => 1, 'errmsg' => '請上傳正確的圖片型別,支援jpg, png, gif, jpeg型別'];
      return json_encode($res);
    } else {
       //生成檔名稱
      $filename = time() . str_random(6) . "." . $ext;
      //檔案儲存路徑
      $filepath = 'uploads/';
      if(!empty($path)) {
        $filepath = 'uploads/'. $path .'/';
      }
      if($format_data) {
        $filepath = $filepath . date('Ym') . '/';
      }
      if (!file_exists($filepath)) {
        @mkdir($filepath);
      }
      if($add_domain) {
        $savepath = config('app.url') . $filepath . $filename;
      } else {
        $savepath = $filepath . $filename;
      }
      if ($file->move($filepath, $filename)) {
        $data = $savepath;
      }
    }
    $res = ['errno' => 0, 'data' => $data];
    return $res;
  }

}

 

前端js

g_object_name = ''
g_object_names = new Array() //多圖片上傳保持
g_object_name_type = 'random_name'
now = timestamp = Date.parse(new Date()) / 1000;
currentUrl = window.location.href;
backendIndex = currentUrl.indexOf('backend');
baseBackend = currentUrl.substr(0, backendIndex);


$(document).ready(function() {
    //上傳
    $('.media-picker').each(function() {
        var el = $(this);
        var elbtn = el.find('.media-picker-button');
        var multi_selection = false;
        // 上傳目錄
        var inputField = el.find('input[type=hidden]');
        var token = $('input[name="_token"]').val();

        // 是否多檔案上傳
        if (elbtn.attr('data-multiple') == 'multiple') {
            multi_selection = true;
            // 如果已經有檔案
            var oldFiles = inputField.val();
            if (oldFiles != '') {
                var oldFilesArr = $.parseJSON(oldFiles);
                for (var x = 0; x < oldFilesArr.length; x++) {
                    g_object_names.push(oldFilesArr[x]);
                }
            }
        }

        var updir = inputField.attr('data-oss-path');
        var uploader = new plupload.Uploader({
            runtimes: 'html5,flash,silverlight,html4',
            browse_button: elbtn.attr('data-id') + '_uploader',
            url: baseBackend + 'backend/upload',
            file_data_name: 'image',
            multi_selection: multi_selection,
            multipart_params: { 'updir': updir, '_token': token },
            auto_start: true,
            flash_swf_url: '../plupload/js/Moxie.swf',
            silverlight_xap_url: '../plupload/js/Moxie.xap',

            filters: {
                mime_types: [ //只允許上傳圖片和zip,rar檔案
                    { title: "Image files", extensions: "jpg,jpeg,gif,png,bmp" },
                    { title: "Video files", extensions: "mp4,3gp" }
                ],
                max_file_size: '10mb', //最大隻能上傳10mb的檔案
                prevent_duplicates: false //不允許選取重複檔案
            },

            init: {
                FilesAdded: function(up) {
                    up.start(); //選擇完後直接上傳
                },

                FileUploaded: function(up, file, info) {
                    if (info.status == 200) {
                        var file_type = file.type;
                        var is_image = file_type.indexOf('image');
                        var is_video = file_type.indexOf('video');
                        // 獲取返回德資料
                        var file_infos = $.parseJSON(info.response);
                        var file_name = file_infos.data;

                        if (multi_selection) {
                            // 多檔案轉為json
                            g_object_names.push(file_name);
                            inputField.val(JSON.stringify(g_object_names));
                            // 把圖片顯示出來
                            var imageHtml = '';
                            for (var i = 0; i < g_object_names.length; i++) {
                                if (is_image > -1) {
                                    imageHtml += '<li><div class="img-info"><img src="' + baseBackend + '/' + g_object_names[i] + '"/><p>' + g_object_names[i] + '</p><div class="delete-image"> X </div></div></li>';
                                }
                                if (is_video > -1) {
                                    imageHtml += '<li><div class="img-info"><video controls src="' + baseBackend + '/' + g_object_names[i] + '"></video><p>' + g_object_names[i] + '</p><div class="delete-image"> X </div></div></li>';
                                }
                            }
                            el.find('.medias-list ul').html(imageHtml);

                        } else {
                            // 單檔案直接用名稱, 
                            inputField.val(file_name);
                            g_object_name = file_name
                                // 把圖片顯示出來
                            var imageHtml = '';
                            if (is_image > -1) {
                                imageHtml = '<li><div class="img-info"><img src="' + baseBackend + '/' + file_name + '"/><p>' + file_name + '</p><div class="delete-image"> X </div></div></li>';
                            }
                            if (is_video > -1) {
                                imageHtml = '<li><div class="img-info"><video controls src="' + baseBackend + '/' + file_name + '"></video><p>' + file_name + '</p><div class="delete-image"> X </div></div></li>';
                            }
                            el.find('.medias-list ul').html(imageHtml);
                        }
                    } else {
                        alert(info.response);
                    }
                },

                Error: function(up, err) {
                    if (err.code == -600) {
                        alert("\n選擇的檔案太大了,可以根據應用情況,在upload.js 設定一下上傳的最大大小");
                    } else if (err.code == -601) {
                        alert("\n選擇的檔案字尾不對,可以根據應用情況,在upload.js進行設定可允許的上傳檔案型別");
                    } else if (err.code == -602) {
                        alert("\n這個檔案已經上傳過一遍了");
                    } else {
                        alert("\nError xml:" + err.response);
                    }
                }
            }
        })
        uploader.init();
    })

    // 刪除
    $('.media-picker').each(function() {
        var el = $(this)
        var inputField = el.find('input[type=hidden]');
        var fileName = inputField.val();
        var elbtn = el.find('.media-picker-button');
        var multi_selection = false;
        // 是否多檔案上傳
        if (elbtn.attr('data-multiple') == 'multiple') {
            multi_selection = true;
        }
        if (multi_selection) {
            el.on('click', '.delete-image', function() {
                var elDel = $(this);
                // 得到filename
                var currentFileName = elDel.prev('p').html();
                // 刪除當前的父級li
                elDel.parent().parent().remove();
                // 重新賦值陣列
                var fileNames = new Array();
                if (g_object_names != '') {
                    fileNames = g_object_names;
                } else {
                    fileNames = $.parseJSON(fileName);
                }
                // 去掉陣列中的當前值
                fileNames.pop(currentFileName);
                $.ajaxSetup({
                    headers: {
                        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                    },
                });
                $.ajax({
                    type: "POST",
                    url: baseBackend + "backend/del_upload",
                    data: "filename=" + currentFileName,
                    success: function(msg) {
                        console.log(msg)
                    }
                });
                inputField.val(JSON.stringify(fileNames));
            })
        } else {
            el.on('click', '.delete-image', function() {
                // 顯示值為空
                el.find('.medias-list ul').html('');
                inputField.val('');

                // oss刪除
                if (g_object_name != '') {
                    fileName = g_object_name;
                }
                $.ajaxSetup({
                    headers: {
                        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                    },
                });
                $.ajax({
                    type: "POST",
                    url: baseBackend + "backend/del_upload",
                    data: "filename=" + fileName,
                    success: function(msg) {
                        console.log(msg)
                    }
                });
            })
        }

    })
})

 

wangeditor


now = timestamp = Date.parse(new Date()) / 1000; 
updir = 'details'
currentUrl = window.location.href;
backendIndex = currentUrl.indexOf('backend');
baseBackend = currentUrl.substr(0, backendIndex);

var E = window.wangEditor
var editor = new E('#content')
//editor.customConfig.zIndex = 0
//editor.customConfig.uploadImgHeaders = {
//    'X-CSRF-TOKEN': $('input[name="_token"]').val()
//}
//editor.customConfig.uploadImgServer = '/backend/updetails'
//editor.customConfig.uploadFileName = 'wangpic[]'
//editor.customConfig.uploadImgMaxSize = 3 * 1024 * 1024


editor.customConfig.onchange = function (html) {
    $('.wangeditor_value').val(html)
};

editor.create();

var token = $('input[name="_token"]').val();
var uploader = new plupload.Uploader({
  runtimes: 'html5,flash,silverlight,html4',
  browse_button: editor.imgMenuId,
  url: baseBackend + 'backend/upload',
  file_data_name: 'image',
  multi_selection: true,
  multipart_params: { 'updir': updir, '_token': token },
  auto_start: true,
  flash_swf_url: '../plupload/js/Moxie.swf',
  silverlight_xap_url: '../plupload/js/Moxie.xap',

  filters: {
      mime_types : [ //只允許上傳圖片和zip,rar檔案
      { title : "Image files", extensions : "jpg,jpeg,gif,png,bmp" }, 
      { title : "video files", extensions : "mp4,3gp" }
      ],
      max_file_size : '10mb', //最大隻能上傳10mb的檔案
      prevent_duplicates : false //不允許選取重複檔案
  },

	init: {
    FilesAdded: function(up) {
      up.start(); //選擇完後直接上傳
    },

		FileUploaded: function(up, file, info) {
      if (info.status == 200)
      {
        var file_type = file.type;
        var is_image = file_type.indexOf('image');
        var is_video = file_type.indexOf('video');
        // 獲取返回德資料
        var file_infos = $.parseJSON(info.response);
        var file_name = file_infos.data;
        if(is_image > -1) {
          editor.cmd.do('insertHtml', '<img src="' + baseBackend + file_name + '" style="width: auto; max-width:100%;"/>');
        }
        if(is_video > -1) {
          editor.cmd.do('insertHtml', '<video controls src="' + baseBackend + file_name + '" style="width: auto; max-width:100%;"></video>');
        }
      }
      else
      {
        alter(info.response);
      } 
    },

    Error: function(up, err) {
      if (err.code == -600) {
        alert("\n選擇的檔案太大了,可以根據應用情況,在upload.js 設定一下上傳的最大大小");
      }
      else if (err.code == -601) {
        alert("\n選擇的檔案字尾不對,可以根據應用情況,在upload.js進行設定可允許的上傳檔案型別");
      }
      else if (err.code == -602) {
        alert("\n這個檔案已經上傳過一遍了");
      }
      else 
      {
        alert("\nError xml:" + err.response);
      }
    }
	}
});

// uploader.init();
editor.config.customUploadInit = uploader.init(); 

 

 

後臺上傳



    public function upload(Request $request) {
      $files = $request->file("image");
      $updir = $request->input('updir');
      $res = Uploads::upfile($files, $updir);
      return json_encode($res);
    }

    public function del_upload(Request $request) {
      $res = ['errno' => 1, 'errmsg' => '刪除失敗'];
      $filename = $request->input('filename');
      if(!empty($filename)) {
        @unlink($_SERVER['DOCUMENT_ROOT'] . '/' . $filename);
        $res = ['errno' => 0, 'errmsg' => '刪除成功'];
      }
      return json_encode($res);
    }