zfile-dev / zfile

在线云盘、网盘、OneDrive、云存储、私有云、对象存储、h5ai、上传、下载
https://www.zfile.vip
MIT License
9.71k stars 1.84k forks source link

能否禁止用户下载,只允许用户在线查看文件视频 #701

Closed huangtc closed 1 month ago

huangtc commented 1 month ago

环境信息

复现步骤

能否禁止用户下载,只允许用户在线查看文件视频

预期结果

能否禁止用户下载,只允许用户在线查看文件视频

实际结果

能否禁止用户下载,只允许用户在线查看文件视频

额外信息

zhaojun1998 commented 1 month ago

这个你可以通过自定义 JS 来实现,不过也只能隐藏下载按钮,用户会 F12 看网络请求的话,还是能从预览的请求中下载到的。隐藏的 JS 参考:

<script>
    // 创建观察器实例
    const observer = new MutationObserver((mutations) => {
        for (let mutation of mutations) {
            if (mutation.type === 'childList') {
                if (document.querySelector('.zfile-index-hover-tools')) {
                    const downloadButton = Array.from(document.getElementsByTagName('use')).find((use) => use.getAttribute('xlink:href') === "#icon-tool-download");
                    if (downloadButton) {
                        downloadButton.parentNode.remove();
                    }
                }

                if (document.querySelector('.v-contextmenu')) {
                    const items = document.querySelectorAll('.v-contextmenu-item');
                    items.forEach((item) => {
                        let label = item.querySelector('label');
                        if (label && (label.textContent === '下载' || label.textContent === '批量下载')) {
                            item.remove();
                        }
                    });
                }

                if (document.querySelector('.zfile-video-tools')) {
                    // 如果子元素下的 img 的 alt 为下载,则删除该元素
                    const downloadButton = Array.from(document.getElementsByTagName('img'))
                        .find((img) => ["下载", "迅雷", "motrix"].includes(img.alt));
                    if (downloadButton) {
                        downloadButton.parentNode.remove();
                    }
                }
            }
        }
    });

    // 配置观察选项
    const config = {attributes: false, childList: true, subtree: true};

    // 开始观察 document
    observer.observe(document, config);
</script>

可能有些地方漏掉了,参考上面的修改吧。