# upan_webdav_php
**Repository Path**: hong108/upan_webdav_php
## Basic Information
- **Project Name**: upan_webdav_php
- **Description**: 针对抖音红薯的webdav u盘,使用php写一个库来上传下载u盘中的文件。红薯的wifi无线u盘内部写了webdav server,php这里只需要写client端就可以使用了
- **Primary Language**: PHP
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2025-04-09
- **Last Updated**: 2025-12-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# upan_webdav_php
#### 介绍
针对抖音红薯的webdav u盘,使用php写一个库来上传下载u盘中的文件。红薯的wifi无线u盘内部写了webdav server,php这里只需要写client端就可以使用了。
其实webdav到处都可以查到资料的,就是http而已。
因为u盘的芯片能力有限,可能支持的webdav功能有限,所以大家自己写的话只需要对接些简单的功能就行了。
u盘本身额外还加了一些小功能,比如重启选项,有需要的可以用上
u盘的重启还是很有用的,因为usb对目录资源不会刷新,不会重新枚举,所以重启usb变成了很必要的事情,不然存储的内容改变了,u盘却不更新看不见。
[去阅读关于websocket_client接口能力的说明文档](websocket_client.md)
#### 软件架构
基于HTTP webDAV
目前缓慢完善php库,其它语言有计划,但暂时没时间弄。大家可以看下面 基本操作 接口说明,用自己喜欢的编程语言写
#### 安装教程
1. 直接下载到自己的项目中,看示例使用 index.php
2. xxxx
3. xxxx
#### 接口说明
##### 前述
目前u盘仅支持http,https暂时还不考虑,建议大家在内网使用。由于芯片性能有限,也没有非常完整性的支持webDAV,当然,
基本操作是支持的,关于webDAV协议,在网络上也是随处可查其技术文档。u盘本身也做了一个web版本的工具,可以查看源码获得相应的功能,也可以打开浏览器调试工具查看具体的网络请求信息,了解请求信息后集成到自己的系统中。
在u盘server中已经做了跨域头信息的设置,所以轻易的可以在浏览器其它站点嵌入访问能力。
下面是整理的一些基本操作接口可以看看。
注意:有中文名字的uri,自己开发记得要把中文做url编码,浏览器默认会把请求地址做url编码
注意:有中文名字的uri,自己开发记得要把中文做url编码,浏览器默认会把请求地址做url编码
注意:有中文名字的uri,自己开发记得要把中文做url编码,浏览器默认会把请求地址做url编码
##### [OPTIONS]询问接口能力
请求类型method: **OPTIONS**
请求URI: **/webdav** _//没有说法_
| 名称 | 说明 |
|:-------|:-------|
| `Allow` | 请求头中返回,展示u盘webDAV可使用的请求类型能力 |
| `DAV` | 请求头中返回,版本没什么意义 |
status 204 No Content
在浏览器中[options]请求被用于探测跨域,只要网络通都会返回204
##### [PROPFIND]目录、文件资源请求
请求类型method: **PROPFIND**
请求URI: **/webdav[/dir or /filePath]** _//可以是目录或者是文件,前缀“/webdav”是u盘根目录固定的_
| 名称 | 说明 |
|:-------|:-------|
| `Depth: [0/1]` | [可选]请求头中携带,无设置或者0值时是只请求uri这个资源信息;1值是要uri目录中所有资源信息 |
[可选]在BODY中携带XML时可以额外获得一些u盘的信息,Depth不为1时有效
```
// 咨询总空间大小
// 咨询已用空间大小
// 请求计算文件的crc32,用于核对文件,大文件慎用,mcu压力大
```
------------------------------------------------------------
##### [PUT]上传文件
请求类型method: **PUT**
请求URI: **/webdav[/filePath_fileName]** _//远程文件要存放的路径与文件名称,前缀“/webdav”是u盘根目录固定的_
| 名称 | 说明 |
|:-------|:-------|
| `Overwrite: [T/F]` | [可选]请求头中携带,无设置或者T值默认覆盖上传;F值是若文件已存在不许覆盖[status 412] |
| `Content-Range: bytes 0-1/2` | [可选]请求头中携带。分块上传的数据
bytes 本次数据块在文件中的起始位置-本次数据块在文件中的终止位置/整个文件大小; |
| `Content-Length: 108` | 请求头中携带。上传文件时要表明文件数据大小 |
| `body` | 把文件数据放在body中上传 |
上传文件时,如果有需要,为了避免覆盖,可以使用[HEAD]请求先探测文件是否已经存在。
虽然有创建目录的请求,但是这里默认自动创建目录,只要路径和文件名称不要超长度,直接对不存在的目录进行文件上传即可。
##### [GET]下载文件
请求类型method: **GET / HEAD** _//GET请求返回实际文件内容,HEAD无内容返回但会携带“Content-Length”_
请求URI: **/webdav[/filePath_fileName]** _//远程文件存放的路径与文件名称,前缀“/webdav”是u盘根目录固定的_
| 名称 | 说明 |
|:-------|:-------|
| `Range: bytes=0-1` | [可选]请求头中携带。要求下载文件的某一块。status 206;有`Content-Range Content-Length`响应头 |
| `body` | 请求时为空;[GET]返回文件数据在body中;[HEAD]无数据返回 |
status 200 为成功
##### [MOVE]移动、重命名文件
请求类型method: **MOVE**
请求URI: **/webdav[/filePath_fileName]** _//远程文件存放的路径与文件名称,前缀“/webdav”是u盘根目录固定的_
| 名称 | 说明 |
|:-------|:-------|
| `Destination: /webdav/目标文件路径名称` | 请求头中携带。移动到的位置与文件名称,有中文名称要进行url编码 |
| `Overwrite: T` | [可选]默认T覆盖,F不能覆盖返回412。假如目标文件已经存在 |
status 201 为成功,204 为已经覆盖
##### [DELETE]删除文件/目录
请求类型method: **DELETE**
请求URI: **/webdav[/dir or file]** _//要删除的目录、文件,前缀“/webdav”是u盘根目录固定的_
| 名称 | 说明 |
|:-------|:-------|
| `Reboot: [0/1/2]` | [可选]请求头中携带,需要uri为`/webdav`,原则上根目录是不能删除的,请求删除根目录主要作用就是为了重启。
无设置或者0值为无效设置;
1值是重启U盘,u盘重启无数据返回,wifi也会断开;
2值是重启USB接口(也可以独立操作:20是断开,21是连上,部分机器反应间隔不同,可以自己决定断开时间,直接使用2值时默认是断开2秒后连上) |
status 200 为成功
##### [Digest]接口认证
**接口请求**
| 名称 | 说明 |
|:-------|:-------|
| `Authorization Digest ...` | 请求头中携带,计算好的摘要认证信息,未设置或者错误 会返回401 |
| `Auth2body: 1` | 请求头中携带,因为浏览器遇到`WWW-Authenticate`返回头可能会弹出登陆授权信息,为了避免弹框,设置此值后,`WWW-Authenticate`内容会放在`body`中返回 |
**401返回**
| 名称 | 说明 |
|:-------|:-------|
| `WWW-Authenticate` | 请求头中返回,未设置`Auth2body: 1`时 |
| `Digest realm...` | body中返回,设置`Auth2body: 1`时`WWW-Authenticate`值将在body中返回 |
u盘中设置需要认证时,所有webDAV接口都需要认证才能正确返回。
Digest认证有一定的缓存时效,在开发时,每次计算好的认证信息要缓存起来避免频繁计算操作,只有当遇到401返回时才需要重新计算。
关于`Auth2body: 1`如果有需要,可以写死在每个请求中,这个是针对浏览器开发才使用的。
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)