Nextcloud 是个不错的网盘系统,开源免费,支持 Windows Ad 域,而且开放了很多接口可以用于二次开发。

最近基于 Nextcloud 做了几个二次开发的功能,下面介绍一下过程。

第一个需求是和公司业务系统对接起来,实现建立项目时自动为项目负责人建立一个同名文件夹和子文件夹。
第二个需求是开放一个页面,可以浏览项目文件夹里的子文件夹、文件等。
第三个需求是可以在开放页面下载列出的文件。

先看第一个需求,我需要做一个接口给业务系统,入参为项目名称的人员唯一信息和项目名称。
Nextcloud 有现成的建立文件夹方法,预想会很顺利。但还是遇到了问题。
由于公司使用的 Windows Ad 域,我是获取不到项目负责人的密码的,所以不能使用项目负责人的帐号去建立文件夹。
然后灵光一闪,我可以使用一个固定的帐号(如:新建个帐户 Administrator)去建立这个文件夹,然后把这个文件夹分享给项目负责人,并分配一定的权限。
但是在找人的步骤又遇到了困难,因为没有表存域帐号。翻来翻去,在 oc_accounts 表里找到了邮箱信息,员工的邮箱基本上都是唯一的,所以可以用这个。
第一个需求方案差不多了,部份(伪)代码如下:

var sql = $"select * from oc_accounts where data like '%\"{email}\"%'"; //查找要分享的用户
oc_accounts[] rst = conn.Query<oc_accounts>(sql).ToArray();
if(l.Length < 1)return (false, null, $"网盘没有找到您提供的域帐号或邮箱"); //没找到要分享的人,直接返回错误
if(l.Length > 1)return (false, null, $"网盘找到了多个用户,请确认您提供的邮箱地址正确!");//找到多个也不行
var cre = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{Adminitrator}:{密码}"));//固定帐号的登录名和密码
(result, header, statusCode) = ExtMethods.ProcessRequest(null, $"{网盘域名}/remote.php/dav/files/{Administrator的根目录(可在oc_ldap_user_mapping表查询)}/{folderName}", new Dictionary<string, string>() { { "Authorization", $"Basic {cre}" } }, "MKCOL", null, null);//这个是 Nextcloud 提供的接口,用来建立文件夹。

上边是建立文件夹,然后是分享部分:

var url = $"{网盘域名}/ocs/v2.php/apps/files_sharing/api/v1/shares";//接口地址
var inputHeader = new Dictionary<string, string>() { { "OCS-APIRequest", "true" }, { "Authorization", $"Basic {cre}" }, { "Content-Type", $"multipart/form-data; } };
string body = $"shareType=0&shareWith={shareWith}&permissions=31&path={path}";
//shareWith 是要分享的人,permissions 是权限,31是最大权限;path 是要分享的路径
(result, header, statusCode) = ExtMethods.ProcessRequest(System.Text.Encoding.UTF8.GetBytes(body), url, inputHeader, "POST", null, null);//调用接口

建立子文件夹方法和上边的一样,很简单,只是使用同步的方法建立的话,时间太长了,后来就做成了,建立主文件夹成功就启动另外一个线程来建立子文件夹,然后就返回了。

subFolders = SubFolders.Select(x => folderName + "/" + x).ToArray();
Thread thread = new Thread(new ThreadStart(DoCreateSubFolders));
thread.Start();private string[] subFolders;
private void DoCreateSubFolders()
{if(subFolders !=null && subFolders.Length > 0){foreach(var s in subFolders){CreateFolder(s);}}
}

第二个需求是列出文件夹的目录,这个先用他们的接口试了试,结果速度太慢了,有点不能接受,后来改成了直接读库。

方案改了之后很顺利,因为 Administrator 用户是固定的,只要在 oc_ldap_user_mapping 表里找到根目录就行了。

var storage = Ioc_StoragesService.GetModelByUserGuid(Administrator根路径);
var rst = Ioc_FilecacheService.GetModelByStorage(storage.numeric_id, folderName);
return rst.Select(x => new OcFileEntity(x, 网盘地址, Request.Scheme + "://" + Request.Host.Value)).ToArray();

第三个需求是下载文件。

由于Nextcloud 本身的下载是需要身份验证的,所以转发肯定是不能用的。然后就想到了,先把文件下载下来,再返回给用户。

WebClient wc = new WebClient();
wc.Headers.Add(HttpRequestHeader.Authorization, $"Basic {cre}");
var folder = System.IO.Path.GetDirectoryName(localpath);wc.DownloadFile($"{网盘地址}/remote.php/dav/files/{Administrator根目录}/{path}", localpath);var sr = new FileStream($"{临时文件夹}/" + path, FileMode.Open);
return File(sr, "application/octet-stream", Path.GetFileName(path), true);

这种实现方法要求站点部署时要和网盘服务器近一点(最好是同一台机器)。

欢迎同样对 Nextcloud 做二次开发的朋友们来交流。

基于 Nextcloud 的二次开发相关推荐

  1. 据说这是熟练掌握python的爷们_dongbei 是一门基于 Python 3 二次开发的东北方言编程语言...

    dongbei - 东北方言编程语言 学编程,就整东北浪! 体格咋地 扫码关注原作者微信公众号"老万故事会": 引言 dongbei是啥?它是一门以东北方言词汇为基本关键字的以人为 ...

  2. java二次开发浏览器内核_深入理解基于Selenium的二次开发

    对于做web端自动化测试的人来说,可能接触selenium比QTP还要多,但是我们在做基于selenium的二次开发的时候,经常会说到二次开发是 为了易于维护,很多人可能不懂得维护的价值是什么,和到底 ...

  3. Vue+Vant 基于DatetimePicker进行二次开发,实现yyyyMMdd hh:mm:ss时间选择

    Vue+Vant 基于DatetimePicker进行二次开发,实现yyyyMMdd hh:mm:ss时间选择 1.效果图 2.前提 3.项目结构 4.index.vue 5.timeSelectio ...

  4. 基于Visio的二次开发

    基于Visio的二次开发 前一段时间,由于项目的需要:学习了一些关于Visio二次开发的知识:现在工具基本成形了,也算告一段落了:因此想总结一下关于Visio的二次开发的一些基本知识: 对于基于Vis ...

  5. WordPress主题 Vieu主题V4.5无授权无限制版 基于Dux主题二次开发 完美运行

    模板简介: WordPress主题vieu基于Dux主题二次开发!的一款专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板.适用范围:wordpress主题.WordPres ...

  6. 海康威视多摄像头实时视频预览(基于SDK的二次开发)

    项目背景 很久没有做工程项目了,最近突然接单,要做多摄像头下运动物体入侵检测及拌线检测,本文测试用到的摄像头是海康威视的DS-2CD23**D摄像头. 环境配置: 1.下载SDK 2.vs2010开发 ...

  7. office 文件在线协作编辑——解决方案1(基于sharepoint的二次开发)

    概述 office 文件在线协作编辑主要是指word.excel.ppt的多人在线协作编辑,实时同步的功能: 这里主要介绍解决方案之一--基于sharepoint的二次开发(还可以基于wopi实现)的 ...

  8. 【基于蜂鸟地图二次开发工具,方便开发者快速开发业务】

    基于蜂鸟地图二次开发工具 lmfmap v0.0.1 开发 lmfmap v0.0.1 基于蜂鸟地图二次封装的工具,让开发者用最少的代码开发自己的业务,让业务和地图解耦,业务提供数据地图提供接口交互 ...

  9. CANanlystII 基于python的二次开发实践

    前期,我已经编写过一篇<CANanlystII 基于linux的二次开发实践>这篇博客承接上一篇博客,所以背景知识和测试场景,就不再赘述. 背景知识和测试场景,可以查阅如下: CANanl ...

最新文章

  1. 整理iOS9适配中出现的坑
  2. 开发大会上,前微软CEO放出的狠话!.NET开发随时起飞,你准备好了吗?
  3. TQ210——S5PV210启动过程
  4. 当遇到用\来分隔字符串
  5. SIP系统怎么禁用?SIP系统完整性保护关闭方法(含M1)
  6. python写一个类方法_python中如何写类
  7. Unity3D引擎工作笔记0001---认识Unity3D 5游戏开发引擎
  8. 你以为写小说就只有一种签约方式?
  9. 前端后台学习笔记汇杂
  10. selenium.common.exceptions.WebDriverException: Message: Failed to start browser:搞哭了
  11. view_image.php,ImageView显示图像控件
  12. 一键自动生成字幕、提取视频字幕方案的详细评测与价格对比(含免费方案)
  13. 第九次java课堂笔记
  14. python可以在手机上学吗_Python 读书
  15. js / java 文档对比
  16. Oracle 外部表
  17. 小程序canvans一键截屏纯前端实现
  18. 十万行业质变正当时:华为云解出了一道产业AI公式
  19. XTF文件解析(1)资源有哪些?
  20. html字体颜色反色,HTML5:画布上的反色文本颜色

热门文章

  1. 大数据在金融领域的应用研究
  2. CSS动画实现心跳效果
  3. 以do为扩展名的网页文件解析
  4. 【填坑】【多图】micro awtrix灯板
  5. 运维监控工具排名(前10名介绍)
  6. Sql Server系列:数据库物理模式设计
  7. ZOJ4125 Sekiro
  8. 2022年7月28日(CSS三大特性、盒子模型)
  9. 对萨德入韩事件的回顾和思考
  10. gvim+w7+vundle安装教程