x-file-storage.dromara.org | x-file-storage.xuyanwu.cn |
Una línea de código almacena archivos localmente, FTP, SFTP, WebDAV, Alibaba Cloud OSS, Huawei Cloud OBS, Qiniu Cloud Kodo, Tencent Cloud COS, Baidu Cloud BOS, Youpai Cloud USS, MinIO, Amazon S3, Google Cloud Storage, FastDFS, Azure Blob Storage, Cloudflare R2, Kingsoft Cloud KS3, Meituan Cloud MSS, JD Cloud OSS, Tianyi Cloud OOS, Mobile Cloud EOS, Woyun OSS, NetEase Shufan NOS, Ucloud US3, Qingyun QingStor, Ping An Cloud OBS, Shouyun OSS, IBM COS y otras plataformas de almacenamiento compatibles con el protocolo S3. Ver todas las plataformas de almacenamiento compatibles
Después de conectarse a Alist a través de WebDAV, puede utilizar servicios de almacenamiento comunes como Baidu Cloud Disk, Tianyi Cloud Disk, Alibaba Cloud Disk y Thunder Cloud Disk para ver las plataformas de almacenamiento compatibles con Alist.
? Admite la migración de archivos entre diferentes plataformas de almacenamiento; consulte archivos de migración para obtener más detalles.
GitHub: https://github.com/dromara/x-file-storage
Casa rural: https://gitee.com/dromara/x-file-storage
Aquí hay un breve registro de actualización, vea el registro de actualización detallado
2.2.1
Se solucionó el problema de los errores de cálculo de hash en algunos casos y el problema de que la URL prefirmada de Qiniu Cloud Kodo no se pudiera utilizar.
2.2.0
soluciona una gran cantidad de problemas, agrega archivos nuevos, enumera archivos, reconstruye URL prefirmadas, admite la carga, descarga, eliminación y otras operaciones del cliente, agrega el complemento Solon, optimiza funciones como la carga manual de varias partes, consulte el registro de actualización para obtener más detalles
2.1.0
soluciona una gran cantidad de problemas, agrega plataformas de almacenamiento FastDFS y Azure Blob Storage, y agrega funciones como copiar y mover (renombrar) archivos, carga manual de varias partes (carga reanudable) y cálculo de hashes. Verifique el registro de actualización. para más detalles.
2.0.0
se dona a la comunidad de código abierto de dromara, cambia el nombre del proyecto, el nombre del paquete, optimiza la estructura del proyecto, admite metadatos, etc. Debe prestar atención a la actualización desde la versión anterior. Consulte el registro de actualización para obtener más detalles. .
Haga clic en Inicio rápido para ver cómo utilizar todas las plataformas de almacenamiento.
Aquí tomamos Alibaba Cloud OSS como ejemplo. pom.xml
se introduce en este proyecto. El valor predeterminado aquí es Solon
referencia del entorno SpringBoot
. Las otras referencias del entorno se utilizan por separado.
<!-- 引入本项目 -->
< 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 >
Agregue la siguiente configuración básica al archivo de configuración application.yml
Con respecto a las diferencias entre los archivos de configuración y varias rutas (rutas) en FileInfo, consulte las Preguntas frecuentes
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/ # 基础路径
Agregue la anotación @EnableFileStorage
a la clase de inicio
@ EnableFileStorage
@ SpringBootApplication
public class SpringFileStorageTestApplication {
public static void main ( String [] args ) {
SpringApplication . run ( SpringFileStorageTestApplication . class , args );
}
}
Admite archivos, archivos múltiples, archivos cargados, bytes [], flujo de entrada, URL, URI, cadenas, HttpServletRequest y los archivos grandes se cargarán automáticamente en partes. Si desea admitir más métodos, lea el capítulo del adaptador de archivos.
@ 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 );
//其它更多操作
Si guarda el registro del archivo en la base de datos, también puede operar en función de la URL de manera más conveniente. Para obtener más detalles, lea el capítulo sobre cómo guardar registros de carga.
//直接从数据库中获取 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" );
//其它更多操作
Haga clic en Inicio rápido para ver cómo utilizar todas las plataformas de almacenamiento.
El código fuente de X File Storage se divide en dos ramas, con las siguientes funciones:
rama | efecto |
---|---|
principal | La rama principal, la rama utilizada por la versión de lanzamiento, es consistente con el jar enviado por la biblioteca central y no recibe ningún PR ni modificación. |
desarrollador | Rama de desarrollo, aceptar modificaciones o PR |
Al enviar comentarios sobre el problema, indique la versión de X File Storage, las versiones de la biblioteca dependiente relacionada, los parámetros de configuración y el código del problema.
Problema de casa rural
Problema de GitHub
Cualquiera puede contribuir a X File Storage y contribuir con código. Para facilitar el uso y el mantenimiento, el PR (solicitud de extracción) que debe enviarse debe cumplir con algunas especificaciones.
X File Storage agradece a todos por su confianza y apoyo. Si ha utilizado X File Storage en su proyecto, espero que pueda dejar la información de su empresa u organización (nombre de la empresa u organización, dirección del sitio web oficial, imagen del logotipo para mostrar).
La información de su empresa se mostrará en el sitio web oficial del proyecto:
x-file-storage.dromara.org
x-file-storage.xuyanwu.cn
almacenamiento-de-archivos-spring.xuyanwu.cn
Regístrate en Gitee Regístrate en GitHub
Si crees que este proyecto es bueno, puedes hacer clic en una estrella o donar para invitar al autor a comer tiras picantes ~ Si no quieres recompensar, puedes escanear el último código con Alipay para recibir un sobre rojo. Me gustaría expresar mi gratitud ^_^
O haga clic en el enlace a continuación, desplácese hasta el final de la página y haga clic en "Donar"
Donar en Gitee
Escanee el código QR de arriba para donar 99 yuanes y envíeme la captura de pantalla QQ1171736840
para unirme al grupo de comunicación VIP (si excede un año, debe donar nuevamente; de lo contrario, se borrará)
También puedes hacer clic para agregar un grupo de comunicación gratuito para comunicarnos juntos.