使用 PicList + Gitee 为 Obsidian 部署免费图床

PicList是一款高效的云存储和图床平台管理工具,基于PicGo深度二次开发,提供完整的图床功能和全面的云存储管理能力,主要特点包括:

  • 完整保留PicGo所有功能,兼容大部分PicGo插件
  • 扩展了内置图床平台,如WebDav、本地图床和SFTP等
  • 相册支持同步云端删除文件
  • 全面的云存储管理功能,包括文件操作、搜索和预览
  • 内置图像处理工具,如水印、压缩、缩放、旋转和格式转换


前提条件

  • 首先要确保已经拥有Gitee账户
  • 电脑已经安装Node.js(因为PicList的插件需要通过npm),没安装的可以看这篇博客 Node.js 环境配置

一、创建图床仓库

访问Gitee:Gitee.com
在Gitee首页中,点击右上角的 + 选择新建仓库

新建仓库1

设置仓库名称(必填),仓库路径根据仓库名称自动生成
将仓库设置为开源,以便于图片可以公开访问,勾选分支模型,点击创建即可

新建仓库

二、获取私人令牌

点击页面右上角的头像,进入设置页面

设置
进入设置页面,在左侧菜单中选择私人令牌选项,并点击生成新令牌

创建令牌

选择projects权限,并添加私人令牌描述,点击提交即可

私人令牌

在弹出的对话框中输入当前账号的密码

密码

生成的令牌只能查看一次,否则需要生成新的令牌,所以我们可以在桌面新建文件将令牌粘贴其中

生成提示

三、安装PicList

访问PicList 安装地址:PicList

进入页面点击下载

Pasted image 20251118171353
根据系统选择合适的版本,Windows系统一般选择 x64的即可

  • x64.exe 通常对应64位Windows系统
  • .exe 通常对应32位Windows操作系统
  • arm64.dmg 适配苹果自研的M系列芯片Mac设备
  • x64.dmg 对应搭载英特尔处理器的Mac设备,如老款MacBook等

Pasted image 20251118171543

下载完成后可能会出现警示,点击右边侧边栏的更多操作,选择保留

Pasted image 20251118172858

在弹出的警示框中选择为仍然保留,之后便可打开文件进行安装

Pasted image 20251118173012

根据自己需求进行安装,点击下一步

Pasted image 20251118173703

根据个人需求选择安装位置,点击安装即可

Pasted image 20251118173819

注意:运行可能会出现不显示界面的情况,需要在右下角的最小化里面点击

四、PicList安装插件

注意:安装插件需要以管理员身份运行,否则因为权限不够安装不了

右键桌面图标,选择以管理员身份运行

Pasted image 20251118175911

进入插件页面,搜索 gitee,然后选择 gitee-uploader 插件进行安装,安装完成后重启应用让插件生效。

Pasted image 20251118174853

五、配置Gitee图床

左边侧边栏选择图床,找到 gitee,进入图床配置页面,然后对 Default 进行编辑,也可以新增

Pasted image 20251118180630

依次填入相关配置,点击确认

  • 配置名:默认为Default
  • repo:Gitee用户名/仓库名 (不要写错,否则将会上传不成功)
  • branch:分支名(默认为master)
  • token:私人令牌
  • path:图片的保存路径,一般写上images
  • customPath:自定义图片保存路径,可以根据需求自行选择
  • customUrl:自定义访问图片时的域名

Pasted image 20251118181322

进入上传页面,点击切换图床,选择gitee,并选择gitee配置

Pasted image 20251118183627

六、PicList设置

根据需求自行进行设置,如果经常需要上传图片,建议设置为开机自启

Pasted image 20251118181815

在配置同步页面,支持一键从picList导入相关配置和相册

image.png

建议打开相册内删除时同步删除云端数据和时间戳重命名

image.png

同时还支持自定义表达式设置高级重命名

Pasted image 20251118182959

图片处理,格式转换,以及水印等

Pasted image 20251118183037

七、 Obsidian 安装插件

打开 Obsidian,进入设置界面,在左侧选项中选择第三方插件,接着在社区插件市场点击浏览

image.png

搜索安装 image auto upload 插件,安装之后点击启用插件即可

image auto upload

八、测试上传

在Obsidian中打开任意笔记,随便截取一张图片并粘贴,便会自动上传到Gitee的仓库中,图片将会以 (https://gitee.com/…) 形式保存在笔记当中。


<think>我们正在处理一个关于Apache POI的问题,具体是当XSSFPicture对象的getPreferredSize()方法返回null时,我们需要判断并跳过该片。 根据引用[1]和[2]的内容,我们知道在读取Excel中的片时可能会遇到一些问题。引用[3]提到了相关的依赖,即我们使用的是poi-ooxml 4.1.2版本。 在Apache POI中,XSSFPicture类表示一个片对象。getPreferredSize()方法用于获取片的首选大小(也就是在Excel中设置的大小)。但有时候这个方法可能会返回null,这可能是由于片在Excel中没有设置大小或者设置有问题。 为了解决这个问题,我们可以在代码中添加一个条件判断:当getPreferredSize()返回null时,跳过对该片的处理。 例如,假设我们正在遍历一个工作表中的所有片,可以这样写: ```java List<XSSFPicture> pictures = sheet.getDrawingPatriarch().getShapes(); for (XSSFPicture picture : pictures) { // 获取片的首选大小 XSSFClientAnchor anchor = picture.getPreferredSize(); if (anchor == null) { // 跳过这个片 continue; } // 否则,继续处理片 // ... 你的处理逻辑 } ``` 但是,请注意,有时候即使getPreferredSize()返回null,片仍然可能有其他方式指定大小(例如,通过getClientAnchor()方法)。因此,根据实际需求,你可能需要考虑是否使用其他方式获取片的位置和大小。 另外,引用[1]中提到,他们通过判断列是否有getPicture=true的标识来获取片信息。这提示我们,可能还需要结合业务逻辑来判断是否需要处理该片。 总结:通过判断`picture.getPreferredSize() == null`来跳过返回null的片。 注意:在遍历片时,我们通常使用`getDrawingPatriarch()`方法,但这个方法可能返回null(如果工作表没有任何绘对象),所以在使用前需要检查。 因此,更健壮的代码可能是: ```java XSSFDrawing drawing = sheet.getDrawingPatriarch(); if (drawing != null) { List<XSSFPicture> pictures = drawing.getShapes(); for (XSSFPicture picture : pictures) { if (picture.getPreferredSize() == null) { // 跳过这个片 continue; } // 处理片 } } ``` 这样,当工作表没有绘对象时,我们不会进入循环;当有绘对象时,对于没有首选大小的片,我们跳过处理。 希望这能解决你的问题。 根据上述内容,生成相关问题: </think>### XSSFPicture.getPreferredSize()返回null的解决方案 在Apache POI中处理Excel片时,当`XSSFPicture.getPreferredSize()`返回null时,通常表示片在Excel中没有定义首选尺寸或处于异常状态。以下是完整的解决方案: ```java XSSFDrawing drawing = sheet.createDrawingPatriarch(); if (drawing != null) { for (XSSFShape shape : drawing.getShapes()) { if (shape instanceof XSSFPicture) { XSSFPicture picture = (XSSFPicture) shape; // 关键处理:检测并跳过返回null的片 if (picture.getPreferredSize() == null) { System.out.println("跳过未定义尺寸的片"); continue; // 跳过当前片处理 } // 正常处理片的逻辑 XSSFClientAnchor anchor = picture.getPreferredSize(); byte[] imageData = picture.getPictureData().getData(); // ...后续处理... } } } ``` #### 解决方案说明: 1. **空值检测机制** 通过`if (picture.getPreferredSize() == null)`明确判断返回的`XSSFClientAnchor`是否为null,是则跳过当前片处理。这种情况通常发生在: - 片被设置为"浮于文字上方"而非嵌入单元格 - Excel文件存在损坏或格式异常 - 使用非常规方式插入的片[^3] 2. **增强健壮性** - 优先创建绘对象:`sheet.createDrawingPatriarch()`确保绘对象存在 - 类型安全转换:通过`instanceof`验证形状是否为片类型 - 异常处理:建议在循环外添加`try-catch`块捕获`NullPointerException` 3. **备选方案** 若需要强制处理无尺寸片,可尝试获取基础锚点信息: ```java XSSFClientAnchor anchor = picture.getPreferredSize(); if (anchor == null) { anchor = picture.getClientAnchor(); // 尝试获取基础锚点 } ``` #### 注意事项: 1. **依赖版本兼容性** 确认使用POI 4.1.2+(如引用[3]),早期版本可能存在已知的片处理缺陷[^2] 2. **片存储位置** Excel片信息存储在`/xl/media/`路径,尺寸信息在`drawingML`中定义,缺失时会导致null[^1] 3. **替代方案** 考虑使用`hutool`工具包的`ExcelPicExtractor`,其内置了空尺寸检测机制: ```java List<PicInfo> picList = ExcelPicExtractor.getPicInfos(sheet); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值