Files
lsky-pro/resources/views/components/upload.blade.php
T
2021-12-14 11:02:15 +08:00

254 lines
12 KiB
PHP

@push('scripts')
<script src="https://cdn.jsdelivr.net/npm/webuploader@0.1.8/dist/webuploader.js"></script>
<script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js"></script>
@endpush
<div class="pb-6 h-full">
<input type="file" id="picker" name="file" class="hidden" accept="image/*" multiple>
<div class="mb-4 p-4 bg-white rounded-md">
<h1 class="tracking-wider text-2xl text-gray-700 mb-2" style="text-shadow: -4px 4px 0 rgb(0 0 0 / 10%);">Image Upload</h1>
<p class="text-gray-500 text-sm">最大可上传 1.00 MB 的图片,单次同时可选择 3 张。本站已托管 3267 张图片。</p>
<div class="mt-3 rounded-md border-2 border-dotted border-stone-300 w-full h-full" id="picker-dnd" onclick="$('#picker input').click()">
<div id="upload-container" class="relative group flex flex-col justify-center items-center p-2 w-full h-full min-h-[150px] sm:min-h-[340px] space-y-4 text-gray-500 cursor-pointer">
<i id="clear" class="fas fa-times absolute top-1 right-1 w-8 h-8 flex justify-center items-center cursor-pointer text-xl text-center hidden group-hover:block text-gray-400 hover:text-gray-500"></i>
<p id="upload-all" title="点我上传全部"><i class="fas fa-cloud-upload-alt text-6xl hover:text-indigo-400"></i></p>
<p class="text-md text-center">拖拽文件到这里,支持多文件同时上传<br/>点击上面的图标上传全部已选择文件</p>
</div>
<div id="upload-preview" class="flex m-2 hidden"></div>
</div>
</div>
<div id="links-container" class="hidden mb-4 p-4 bg-white rounded-md relative group">
<div class="absolute top-2 right-2 flex">
<span id="copy-all" class="px-2 py-1 rounded-md text-xs text-gray-800 bg-gray-100 cursor-pointer hidden group-hover:block">复制全部</span>
<span id="clear-all" class="ml-1 px-2 py-1 rounded-md text-xs text-gray-800 bg-gray-100 cursor-pointer hidden group-hover:block">清除</span>
</div>
<div id="link-tabs" class="flex flex-nowrap overflow-scroll scrollbar-none text-sm">
<a href="javascript:void(0)" data-tab-name="url" class="hover:bg-gray-100 flex justify-center items-center px-8 py-2 border-b-2 border-indigo-500 active">URL</a>
<a href="javascript:void(0)" data-tab-name="html" class="hover:bg-gray-100 flex justify-center items-center px-8 py-2 border-b-2 border-transparent">HTML</a>
<a href="javascript:void(0)" data-tab-name="bbcode" class="hover:bg-gray-100 flex justify-center items-center px-8 py-2 border-b-2 border-transparent">BBCode</a>
<a href="javascript:void(0)" data-tab-name="markdown" class="hover:bg-gray-100 flex justify-center items-center px-8 py-2 border-b-2 border-transparent">Markdown</a>
<a href="javascript:void(0)" data-tab-name="markdown_with_link" class="hover:bg-gray-100 flex justify-center items-center px-8 py-2 border-b-2 border-transparent whitespace-nowrap">Markdown with link</a>
</div>
<div id="links" class="mt-2">
<div data-tab="url" class="space-y-2"></div>
<div data-tab="html" class="hidden space-y-2"></div>
<div data-tab="bbcode" class="hidden space-y-2"></div>
<div data-tab="markdown" class="hidden space-y-2"></div>
<div data-tab="markdown_with_link" class="hidden space-y-2"></div>
</div>
</div>
</div>
<script type="text/html" id="image-preview-tpl">
<div data-id="__id__" class="w-full flex items-center p-2 mb-2 rounded-md relative bg-gray-50 overflow-hidden">
<div class="absolute inset-0">
<div class="w-[0%] h-full bg-gray-200 opacity-70 upload-progress"></div>
</div>
<div class="relative flex w-full">
<div class="w-10 h-10 bg-gray-200 rounded-lg cursor-pointer overflow-hidden">
<img class="w-full h-full" src="__src__">
</div>
<div class="flex justify-end flex-col ml-2 w-[80%] opacity-70">
<p class="text-sm truncate">__name__</p>
<p class="text-xs truncate">
<span>__info__</span>, <span class="upload-info">等待上传</span>
</p>
</div>
</div>
<div class="absolute right-2 flex space-x-2">
<a href="javascript:void(0)" data-operate="remove" class="flex justify-center items-center block shadow-sm w-10 h-10 rounded-full text-gray-600 bg-gray-100 hover:bg-gray-200 aspect-w-1 aspect-h-1"><i class="fas fa-times"></i></a>
<a href="javascript:void(0)" data-operate="upload" class="flex justify-center items-center block shadow-sm w-10 h-10 rounded-full text-gray-600 bg-gray-100 hover:bg-gray-200 aspect-w-1 aspect-h-1"><i class="fas fa-upload"></i></a>
</div>
</div>
</script>
@push('scripts')
<script>
(new ClipboardJS('#copy-all', {
text: function(trigger) {
var text = '';
$('[data-tab="' + $('#link-tabs a.active').data('tab-name') + '"] p').each(function (i) {
if (i !== 0) {
text += '\r\n';
}
text += $(this).text();
});
return text;
}
})).on('success', function(e) {
if (! $(e.trigger).attr('disabled')) {
var text = $(e.trigger).text();
$(e.trigger).attr('disabled', true).text('复制成功');
setTimeout(function () {
$(e.trigger).attr('disabled', false).text(text);
}, 1000);
}
}).on('error', function(e) {});
</script>
<script>
const UPLOAD_WAITING = 0; // 等待上传
const UPLOAD_SUCCESS = 1; // 上传成功
const UPLOAD_ERROR = 2; // 上传失败
var uploader = WebUploader.create({
server: '/upload',
dnd: '#picker-dnd',
disableGlobalDnd: true,
pick: {
id: '#picker',
multiple: true,
},
threads: 3,
fileSingleSizeLimit: 5242880,
formData: {},
accept: {
title: 'Images',
extensions: 'gif,jpg,jpeg,bmp,png',
mimeTypes: 'image/*'
}
});
var $previews = $('#upload-preview');
var $links = $('#links-container');
// 获取某个预览图片dom
var $getPreview = function (id) {
return $previews.find('[data-id="' + id + '"]');
}
// 设置某个预览片上传状态
var $setPreviewStatus = function ($preview, status, msg) {
var $info = $preview.find('.upload-info');
$info.removeClass('text-green-800 text-red-500');
switch (status) {
case UPLOAD_WAITING:
$info.text('等待上传');
break;
case UPLOAD_SUCCESS:
$info.addClass('text-green-800').text('上传成功');
break;
case UPLOAD_ERROR:
$info.addClass('text-red-500').text('上传失败');
break;
}
if (msg) $info.text(msg);
};
uploader.on('uploadBeforeSend', function (object, data, headers) {
headers['X-CSRF-TOKEN'] = $('meta[name="csrf-token"]').attr('content');
});
uploader.on('fileQueued', function(file) {
// 创建缩略图
uploader.makeThumb(file, function(error, src) {
if (error) {
// 创建失败
}
var html = $('#image-preview-tpl')
.html()
.replace(/__id__/g, file.id)
.replace(/__src__/g, src)
.replace(/__name__/g, file.name)
.replace(/__info__/g, utils.formatSize(file.size));
$previews.append(html).show();
}, 100, 100);
});
uploader.on('uploadStart', function (file) {
$getPreview(file.id).find('[data-operate="upload"]').hide();
});
uploader.on('uploadAccept', function (object, ret) {
});
uploader.on('uploadProgress', function (file, percentage) {
var $preview = $getPreview(file.id);
var $uploadInfo = $preview.find('.upload-info');
var $uploadProgress = $preview.find('.upload-progress');
var rate = (percentage * 100).toFixed(2) + '%';
$uploadInfo.text('上传中...' + rate);
$uploadProgress.css('width', rate);
});
uploader.on('uploadError', function (file, reason) {
// Status Code: 400 ~ 400
if (reason === 'http') {
}
if (reason === 'server') {
}
$setPreviewStatus($getPreview(file.id), UPLOAD_ERROR, '服务异常,请刷新重试')
});
uploader.on('uploadSuccess', function (file, response) {
var $preview = $getPreview(file.id);
if (response.status) {
$preview.attr('uploaded', true);
$setPreviewStatus($preview, UPLOAD_SUCCESS);
// 追加链接
for (var key in response.data) {
$('#links [data-tab="' + key + '"]').append('<p class="whitespace-nowrap select-all mt-1 bg-gray-50 hover:bg-gray-200 text-gray-600 rounded px-2 py-1 cursor-pointer overflow-scroll scrollbar-none">' + response.data[key].toString() + '</p>')
}
$links.show();
} else {
$setPreviewStatus($preview, UPLOAD_ERROR, response.message);
// 重新显示上传按钮
$preview.find('[data-operate="upload"]').show();
}
});
uploader.on('uploadComplete', function (file) {
console.log('uploadComplete', file)
});
uploader.on('error', function (type, max, file) {
// 不同类型的错误,第二个和第三个参数会有不同,坑😢
if (type === 'F_EXCEED_SIZE') {
toastr.warning('文件大小超出限制(max: ' + utils.formatSize(max) + '), ' + file.name);
}
});
$('#upload-all').click(function (e) {
e.stopPropagation();
// 没有任何未上传的文件,选择文件
if ($previews.find('[data-id]').length === $previews.find('[data-id][uploaded]').length) {
$('#picker input').click();
}
// 组件正在上传,不进行任何操作
if (uploader.isInProgress()) {
return false;
}
// 上传队列中状态正常的文件,上传失败的需要传指定文件重新上传
uploader.upload();
});
$previews.click(function (e) {
e.stopPropagation();
});
$('#clear').click(function (e) {
e.stopPropagation();
uploader.reset();
$previews.html('');
});
$previews.on('click', '[data-operate]', function () {
var $getPreview = $(this).closest('[data-id]');
var method = $(this).data('operate');
var id = $getPreview.data('id');
if (method === 'remove') {
uploader.cancelFile(id);
uploader.removeFile(id, true);
$getPreview.remove();
}
if (method === 'upload') {
uploader.upload(id);
}
});
$('[data-tab-name]').click(function () {
$(this).removeClass('active border-transparent')
.addClass('active border-indigo-500')
.siblings()
.removeClass('active border-indigo-500')
.addClass('border-transparent');
$('[data-tab]').hide();
$('[data-tab="' + $(this).data('tab-name') + '"]').show()
});
$('#clear-all').click(function () {
$('[data-tab]').html('')
$links.hide();
});
</script>
@endpush