x-file-storage.dromara.org | x-file-storage.xuyanwu.cn | spring-file-storage.xuyanwu.cn
一行程式碼將檔案儲存到本機、FTP、SFTP、WebDAV、阿里雲OSS、華為雲端OBS、七牛雲Kodo、騰訊雲COS、百度雲BOS、再拍雲USS、MinIO、 Amazon S3、GoogleCloud Storage、FastDFS、 Azure Blob Storage、Cloudflare R2、金山雲KS3、美團雲MSS、京東雲OSS、天翼雲OOS、行動雲EOS、沃雲OSS、網路易數帆NOS、Ucloud US3、青雲QingStor、平安雲OBS、首雲OSS、IBM COS、其它相容於S3 協定的儲存平台。查看所有支援的儲存平台
透過WebDAV 連接到Alist 後,可以使用百度網盤、天翼雲端硬碟、阿里雲盤、迅雷網盤等常見儲存服務,查看Alist 支援的儲存平台
? 支援在不同儲存平台之間遷移文件,詳情查看遷移文件
GitHub:https://github.com/dromara/x-file-storage
Gitee:https://gitee.com/dromara/x-file-storage
這裡是簡要的更新記錄,查看詳細的更新記錄
2.2.1
修正某些情況下哈希運算錯誤的問題、七牛雲Kodo 預簽URL 無法使用的問題更新記錄2.2.0
修復大量問題,新增獲取文件、列舉文件,重構預簽名URL 支援客戶端上傳、下載、刪除等操作,新增Solon 插件,優化手動分片上傳等功能,詳情查看更新記錄2.1.0
修復大量問題,新增儲存平台FastDFS 和Azure Blob Storage,新增複製、移動(重命名)文件,手動分片上傳(斷點續傳)和計算哈希等功能,詳情查看更新記錄2.0.0
捐贈至dromara 開源社區,更改專案名稱、包名,優化專案結構、支援Metadata 元資料等,從舊版升級需要注意,詳情查看更新記錄
點擊快速入門查看全部儲存平台的使用方法!
這裡以阿里雲OSS 為例, pom.xml
引入本項目,這裡預設是SpringBoot
環境, Solon
環境參考在Solon 中使用,其它環境參考脫離SpringBoot 單獨使用
<!-- 引入本项目 -->
< dependency >
< groupId >org.dromara.x-file-storage</ groupId >
< artifactId >x-file-storage-spring</ artifactId >
< version >2.2.1</ version >
</ dependency >
<!-- 引入 阿里云 OSS SDK,如果使用其它存储平台,就引入对应的 SDK -->
< dependency >
< groupId >com.aliyun.oss</ groupId >
< artifactId >aliyun-sdk-oss</ artifactId >
< version >3.16.1</ version >
</ dependency >
application.yml
設定檔中新增以下基礎配置
關於設定檔及FileInfo 中各種路徑(path)的區別,可以參考常見問題
dromara :
x-file-storage : #文件存储配置
default-platform : aliyun-oss-1 #默认使用的存储平台
aliyun-oss :
- platform : aliyun-oss-1 # 存储平台标识
enable-storage : true # 启用存储
access-key : ??
secret-key : ??
end-point : ??
bucket-name : ??
domain : ?? # 访问域名,注意“/”结尾,例如:https://abc.oss-cn-shanghai.aliyuncs.com/
base-path : test/ # 基础路径
在啟動類別上加上@EnableFileStorage
註解
@ EnableFileStorage
@ SpringBootApplication
public class SpringFileStorageTestApplication {
public static void main ( String [] args ) {
SpringApplication . run ( SpringFileStorageTestApplication . class , args );
}
}
支援File、MultipartFile、UploadedFile、byte[]、InputStream、URL、URI、String、HttpServletRequest,大檔案會自動分片上傳。如果想支援更多方式,請閱讀文件適配器章節
@ RestController
public class FileDetailController {
@ Autowired
private FileStorageService fileStorageService ; //注入实列
/**
* 上传文件
*/
@ PostMapping ( "/upload" )
public FileInfo upload ( MultipartFile file ) {
//只需要这一行代码即可上传成功
return fileStorageService . of ( file ). upload ();
}
/**
* 上传文件,成功返回文件 url
*/
@ PostMapping ( "/upload2" )
public String upload2 ( MultipartFile file ) {
FileInfo fileInfo = fileStorageService . of ( file )
. setPath ( "upload/" ) //保存到相对路径下,为了方便管理,不需要可以不写
. setSaveFilename ( "image.jpg" ) //设置保存的文件名,不需要可以不写,会随机生成
. setObjectId ( "0" ) //关联对象id,为了方便管理,不需要可以不写
. setObjectType ( "0" ) //关联对象类型,为了方便管理,不需要可以不写
. putAttr ( "role" , "admin" ) //保存一些属性,可以在切面、保存上传记录、自定义存储平台等地方获取使用,不需要可以不写
. upload (); //将文件上传到对应地方
return fileInfo == null ? "上传失败!" : fileInfo . getUrl ();
}
/**
* 上传图片,成功返回文件信息
* 图片处理使用的是 https://github.com/coobird/thumbnailator
*/
@ PostMapping ( "/upload-image" )
public FileInfo uploadImage ( MultipartFile file ) {
return fileStorageService . of ( file )
. image ( img -> img . size ( 1000 , 1000 )) //将图片大小调整到 1000*1000
. thumbnail ( th -> th . size ( 200 , 200 )) //再生成一张 200*200 的缩略图
. upload ();
}
/**
* 上传文件到指定存储平台,成功返回文件信息
*/
@ PostMapping ( "/upload-platform" )
public FileInfo uploadPlatform ( MultipartFile file ) {
return fileStorageService . of ( file )
. setPlatform ( "aliyun-oss-1" ) //使用指定的存储平台
. upload ();
}
/**
* 直接读取 HttpServletRequest 中的文件进行上传,成功返回文件信息
* 使用这种方式有些注意事项,请查看文档 基础功能-上传 章节
*/
@ PostMapping ( "/upload-request" )
public FileInfo uploadPlatform ( HttpServletRequest request ) {
return fileStorageService . of ( request ). upload ();
}
}
//手动构造文件信息,可用于其它操作
FileInfo fileInfo = new FileInfo ()
. setPlatform ( "huawei-obs-1" )
. setBasePath ( "test/" )
. setPath ( "aa/" )
. setFilename ( "image.png" )
. setThFilename ( "image.png.min.jpg" );
//文件是否存在
boolean exists = fileStorageService . exists ( fileInfo );
//下载
byte [] bytes = fileStorageService . download ( fileInfo ). bytes ();
//删除
fileStorageService . delete ( fileInfo );
//其它更多操作
如果將文件記錄儲存到資料庫中,還可以更方便的根據URL 進行操作了,詳情請閱讀儲存上傳記錄章節
//直接从数据库中获取 FileInfo 对象,更加方便执行其它操作
FileInfo fileInfo = fileStorageService . getFileInfoByUrl ( "https://abc.def.com/test/aa/image.png" );
//文件是否存在
boolean exists = fileStorageService . exists ( "https://abc.def.com/test/aa/image.png" );
//下载
byte [] bytes = fileStorageService . download ( "https://abc.def.com/test/aa/image.png" ). bytes ();
//删除
fileStorageService . delete ( "https://abc.def.com/test/aa/image.png" );
//其它更多操作
點擊快速入門查看全部儲存平台的使用方法!
X File Storage 的原始碼分為兩個分支,功能如下:
分支 | 作用 |
---|---|
main | 主分支,release 版本使用的分支,與中央庫提交的jar 一致,不接收任何pr 或修改 |
dev | 開發分支,接受修改或pr |
提交問題回饋請說明正在X File Storage 版本、相關依賴程式庫版本、設定參數及問題程式碼
Gitee issue
GitHub issue
歡迎任何人為X File Storage 添磚加瓦,貢獻程式碼,為了易用性和可維護性,需要提交的pr(pull request)符合一些規範,規範如下:
X File Storage 感謝各位小夥伴的信任與支持,如果您已經在專案中使用了X File Storage,希望您留下您的公司或組織資訊(公司或組織名稱、官網地址、展示Logo 圖片)
您的公司資訊將在專案官網進行展示:
x-file-storage.dromara.org
x-file-storage.xuyanwu.cn
spring-file-storage.xuyanwu.cn
在Gitee 登記在GitHub 登記
如果你覺得這個項目不錯,可以點個Star 或捐贈請作者吃包辣條~,不想打賞的話用支付寶掃最後一個碼可以領取個紅包,在此表示感謝^_^
或者點擊以下鏈接,將頁面拉到最下方點擊“捐贈”即可
Gitee上捐贈
掃描上方二維碼捐贈99 元,截圖發我QQ1171736840
即可加入VIP 交流群(超過一年則需要再次捐贈,否則將進行清退)
也可以點選新增免費交流群組一起交流