如何在 Laravel 项目中轻松实现拖拽和剪切板黏贴上传图片?

许多平台或者网站都支持用户在评论中上传图片,为了用户能更好的上传图片,许多都支持拖拽和剪切板粘贴上传,用起来感觉很酷,在开发我的个人网站时也需要这样的功能,在《如何在Laravel项目中轻松实现上传头像功能?》中已经实现了简单的图片上传功能,接下来介绍拖拽和剪切板粘贴上传图片。

评论框

views/articles 目录下创建 _comment_editor.blade.php 文件,在里面编写如下代码:

<div class="card">
    <div class="card-content">
        <form action="{{route('comments.store')}}" class="reply-form" method="post">
            {{csrf_field()}}
            <input type="hidden" name="article_id" value="{{$article->id}}">
            <div id="reply_notice" class="" style="color: gray;padding: 1rem;border: dashed 1px;font-size: 14px;">
                <ul class="helpblock list rm-link-color add-link-underline">
                    <li>请注意单词拼写,以及中英文排版,<a href="https://github.com/sparanoid/chinese-copywriting-guidelines">参考此页</a></li>
                    <li>支持 Markdown 格式, <strong>**粗体**</strong>、~~删除线~~、<code>`单行代码`</code>, 更多语法请见这里 <a href="https://github.com/riku/Markdown-Syntax-CN/blob/master/syntax.md">Markdown 语法</a></li>
                   {{-- <li>支持表情,使用方法请见 <a href="https://laravel-china.org/topics/45" target="_blank">Emoji 自动补全来咯</a>,可用的 Emoji 请见 <img title=":metal:" alt=":metal:" class="emoji" src="https://lccdn.phphub.org/assets/images/emoji/metal.png" align="absmiddle"> <img title=":point_right:" alt=":point_right:" class="emoji" src="https://lccdn.phphub.org/assets/images/emoji/point_right.png" align="absmiddle"> <a href="https://laravel-china.org/ecc/index.html" target="_blank" rel="nofollow"> Emoji 列表 </a> <img title=":star:" alt=":star:" class="emoji" src="https://lccdn.phphub.org/assets/images/emoji/star.png" align="absmiddle"> <img title=":sparkles:" alt=":sparkles:" class="emoji" src="https://lccdn.phphub.org/assets/images/emoji/sparkles.png" align="absmiddle"> </li>
                   --}} <li>上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif</li>
                    {{--<li>发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空</li>--}}
                </ul>
            </div>
            <div class="message is-primary " style="margin: 1rem 0;">
                <div class="message-body" style="color:#10a3a3;">
                    <i class="fa fa-info"></i> &nbsp;&nbsp;请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
                </div>
            </div>
            <div class="field" >
                <p class="control">
                    <textarea id="content" class="textarea" placeholder="输入内容,支持markdown" name="content"></textarea>
                </p>
            </div>
            <div class="field">
                <p class="control">
                    <button class="button is-link" type="submit"><span class="icon"><i class="fa fa-send"></i></span><span>提交</span></button>
                </p>
            </div>
        </form>
    </div>
</div>

效果如下:

image.png | left | 827x324

拖拽和剪切板上传图片

我们使用开源的插件-Inline Attachment,它可以让我们很轻松的实现拖拽和剪切板粘贴上传图片,看看它动图效果:

d.gif | left | 546x338

使用起来很方便,我们只需引入 inline-attachment.jsinput.inline-attachment.js 两个文件就可以,从 Github 上下载下来,并拷贝到 public/js 目录下,然后引入到 _comment_editor.blade.php 中,引入代码如下:

<script src="{{asset('js/inline-attachment.js')}}"></script>
<script src="{{asset('js/input.inline-attachment.js')}}"></script>

接下来在 _comment_editor.blade.php 文件中配置 Inline Attachment ,编写代码如下:

<script>
    inlineAttachment.editors.input.attachToInput(document.getElementById("content"), {
        uploadUrl:'{{route('upload.images')}}',
        extraParams: {
            '_token': '{{csrf_token()}}',
        },
        onFileUploadResponse: function(xhr) {
            var result = JSON.parse(xhr.responseText),
                filename = result[this.settings.jsonFieldName];

            if (result && filename) {
                var newValue;
                if (typeof this.settings.urlText === 'function') {
                    newValue = this.settings.urlText.call(this, filename, result);
                } else {
                    newValue = this.settings.urlText.replace(this.filenameTag, filename);
                }
                var text = this.editor.getValue().replace(this.lastValue, newValue);
                this.editor.setValue(text);
                this.settings.onFileUploaded.call(this, filename);
            }
            return false;
        }
    });
</script>

从代码中我们可以看到,我们先将其绑定到我们的 textarea 上,并且我们设置了 uploadUrl 项指定了图片上传路由名为
uploads.images 。所以接下来我们在 routes/web.php 中添加路由,代码如下:

Route::post('/upload_images','ArticlesController@uploadImage')->name('upload.images');

app/Http/Controllers/ArticlesController.php 中添加 uploadImage 方法用以上传图片并返回图片地址,代码如下:

public function uploadImage(Request $request,ImageUploadHandler $imageUploadHandler)
{
    if ($file = $request->file('file')) {
        try {
            $result = $imageUploadHandler->save($file, 'articles', 1);

        } catch (\Exception $exception) {
            return ['error' => $exception->getMessage()];
        }
        $data['filename'] = $result['path'];
    } else {
        $data['error'] = 'Error while uploading file';
    }
    return $data;
}

细心的你可能已经发现,我们引用了一个 ImageUploadHandler 类,这个类的代码在上一篇文章中已经发过了,至此拖拽和剪切板粘贴上传图片功能已然完成,效果如下图:

image.png | left | 827x327

感谢阅读,我是sevdot,全栈开发工程师和终身学习者。
不喜勿喷,以人为善,比聪明更重要。
欢迎留言和关注,且接受任何宝贵的建议。
了解更多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在el-table实现拖拽排序,可以通过以下步骤来实现: 1. 首先,确保你已经引入了element-ui库,并正确使用了el-table组件。 2. 在el-table,给需要排序的列添加一个自定义的拖拽排序指令。可以使用vuedraggable或其他类似的拖拽库来实现。 3. 在自定义指令,监听拖拽事件,获取拖拽的起始位置和目标位置。 4. 根据起始位置和目标位置,更新数据源对应的数据项的顺序。 5. 在el-table使用v-for指令遍历数据源,确保数据项的顺序与数据源一致。 下面是一个简单的示例代码: ```html <template> <el-table :data="tableData"> <el-table-column label="姓名" prop="name"> <template slot-scope="scope"> <div v-drag-sort class="drag-handle">{{ scope.row.name }}</div> </template> </el-table-column> <el-table-column label="年龄" prop="age"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20 }, { name: '李四', age: 25 }, { name: '王五', age: 30 }, ], }; }, directives: { dragSort: { bind(el, binding, vnode) { const dragHandle = el.querySelector('.drag-handle'); dragHandle.addEventListener('dragstart', (event) => { event.dataTransfer.setData('text/plain', vnode.key); }); el.addEventListener('dragover', (event) => { event.preventDefault(); }); el.addEventListener('drop', (event) => { event.preventDefault(); const sourceKey = event.dataTransfer.getData('text/plain'); const targetKey = vnode.key; const sourceIndex = vnode.context.tableData.findIndex((item) => item.name === sourceKey); const targetIndex = vnode.context.tableData.findIndex((item) => item.name === targetKey); if (sourceIndex > -1 && targetIndex > -1) { const [removed] = vnode.context.tableData.splice(sourceIndex, 1); vnode.context.tableData.splice(targetIndex, 0, removed); } }); }, }, }, }; </script> ``` 这样,你就可以在el-table实现拖拽排序了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SevDot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值