123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- /**
- * 1. 基于 axios 和 SweetAlert2 图片上传插件
- * 2. 不支持旧版浏览器, 谨慎使用
- * 3. 插件调用如下: 更多参数, 参考 contructor 方法下的 setting 默认配置
- */
- /* **************************************************************
- ## html
- ```
- <img id="upload-img"
- class="upload-img image-border ui popover"
- data-variation="inverted"
- data-content="【点击我】上传图片吧"
- src="{{ default_img() }}" width="320">
- ```
- ## javascript
- ```
- $("#upload-img").click(function () {
- let self = this;
- new MyUploadOne({
- 'file_type': '',
- success: function (res) {
- let path = assert_images(res.data.path);
- $(self).attr('src', path);
- }
- });
- });
- ```
- ************************************************************** */
- class MyUploadOne {
- constructor(setting = {}){
- // 默认值
- this.setting = Object.assign({}, {
- // 验证单个文件大小限制
- fileSingleSizeLimit: 2 * 1024 * 1024,
- method: 'POST',
- // 文件 name 字段
- file_name: 'image',
- // 文件所属类型 [ 后台需要 ][ 必填 ]
- file_type: '',
- // create:上传, update:更新, delete:删除
- action: 'create',
- // url: ''
- // method: ''
- // path: '' 更新图片使用
- // 上传成功
- success: function () {},
- // 上传失败
- error: function () {}
- }, setting);
- if (this.setting.action == 'delete') {
- let formData = new FormData();
- // 自定义formData中的内容
- // 文件所属类型 [ 后台需要 ]
- formData.append('image_type', this.setting.file_type);
- // 动作
- formData.append('action', this.setting.action);
- if (this.setting.path) {
- formData.append('path', this.setting.path);
- }
- // 上传图片
- this.uploadImg(formData);
- } else {
- this.init();
- }
- }
- init(){
- let self = this;
- (async function getImage () {
- const {value: file} = await Swal.fire({
- title: '选择一个图片',
- input: 'file',
- inputAttributes: {
- 'accept': 'image/*',
- 'aria-label': 'Upload your profile picture'
- }
- });
- if (file) {
- // 展示
- let reader = new FileReader;
- reader.onload = (e) => {
- let imgBase64 = e.target.result;
- Swal.fire({
- title: '正在上传, 请耐心等待...',
- imageUrl: imgBase64,
- imageAlt: '图片已准备好, 正在上传'
- });
- };
- reader.readAsDataURL(file);
- // 相关上传操作
- self.handleInputChange(file);
- }
- })()
- }
- handleInputChange(file){
- // 检查文件类型
- if(['jpeg', 'png', 'gif', 'jpg'].indexOf(file.type.split("/")[1]) < 0){
- Swal.fire({
- position: 'top-end',
- type: 'error',
- title: '文件类型仅支持 jpeg/png/gif!',
- showConfirmButton: false,
- timer: 2000
- });
- return;
- }
- // 文件大小限制
- if(file.size > this.fileSingleSizeLimit ) {
- // 文件大小自定义限制
- Swal.fire({
- position: 'top-end',
- type: 'error',
- title: '文件大小不能超过 2MB!',
- showConfirmButton: false,
- timer: 2000
- });
- return;
- }
- this.transformFileToFormData(file);
- }
- // 将File append进 FormData
- transformFileToFormData(file){
- let formData = new FormData();
- // 自定义formData中的内容
- // type
- formData.append('type', file.type);
- // size
- formData.append('size', file.size || "image/jpeg");
- // name
- formData.append('name', file.name);
- // lastModifiedDate
- formData.append('lastModifiedDate', file.lastModifiedDate);
- // append 文件
- formData.append(this.setting.file_name, file);
- // 文件所属类型 [ 后台需要 ]
- formData.append('image_type', this.setting.file_type);
- // 动作
- formData.append('action', this.setting.action);
- if (this.setting.path) {
- formData.append('path', this.setting.path);
- }
- // 上传图片
- this.uploadImg(formData);
- }
- // 上传图片
- uploadImg(formData){
- let self = this;
- let url = Config.routes.upload_image;
- let method = 'POST';
- if (this.setting.action != 'create') {
- url = this.setting.url;
- method = this.setting.method;
- }
- axios({
- url: url,
- method: method,
- data: formData
- }).then((res)=> {
- if (self.setting.action != 'delete') {
- Swal.fire({
- position: 'top-end',
- type: 'success',
- title: 'upload success',
- showConfirmButton: false,
- timer: 2000
- });
- }
- // 回调
- this.setting.success(res);
- }).catch(function (error) {
- let response = error.response,
- html = '';
- if (response.data && response.data.errors) {
- for (let error in response.data.errors) {
- html += '<p style="text-align: left;">' + response.data.errors[error] + '</p>';
- }
- Swal.fire({
- type: 'error',
- html: html,
- showConfirmButton: false,
- showCancelButton: true
- });
- } else if(response.data && response.data.message){
- Swal.fire({
- type: 'error',
- text: response.data.message,
- showConfirmButton: false,
- showCancelButton: true
- });
- }else {
- // 回调
- self.setting.error(error);
- }
- });
- }
- }
- window.MyUploadOne = MyUploadOne;
|