Giter Site home page Giter Site logo

dromara / x-file-storage Goto Github PK

View Code? Open in Web Editor NEW
1.1K 20.0 224.0 1.87 MB

一行代码将文件存储到 本地、FTP、SFTP、WebDAV、谷歌云存储、阿里云OSS、华为云OBS、七牛云Kodo、腾讯云COS、百度云 BOS、又拍云USS、MinIO、 AWS S3、FastDFS、 Azure Blob Storage、金山云 KS3、美团云 MSS、京东云 OSS、天翼云 OOS、移动云 EOS、沃云 OSS、 网易数帆 NOS、Ucloud US3、青云 QingStor、平安云 OBS、首云 OSS、IBM COS、其它兼容 S3 协议的平台。后续即将支持 Samba、NFS

Home Page: https://x-file-storage.xuyanwu.cn/

License: Apache License 2.0

Java 100.00%
file-storage file-upload ftp java oss s3 sftp spring webdav bos

x-file-storage's Introduction

logo
原名 X Spring File Storage 现已捐赠至 dromara 开源组织

x-file-storage.dromara.org | x-file-storage.xuyanwu.cn | spring-file-storage.xuyanwu.cn

github star star
515706495


📚简介

一行代码将文件存储到本地、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.1.0 修复大量问题,新增存储平台 FastDFS 和 Azure Blob Storage,新增复制、移动(重命名)文件,手动分片上传(断点续传)和计算哈希等功能,详情查看 更新记录
2.0.0 捐赠至 dromara 开源社区,更改项目名、包名,优化项目结构、支持 Metadata 元数据等,从旧版升级需要注意,详情查看 更新记录
1.0.3 修复了 FileStorageClientFactory 未自动加载等问题,查看 更新记录
1.0.2 修复了华为云 OBS 未加载的问题,查看 更新记录
1.0.1 修复了 MultipartFile 无法正确获取文件名等问题,查看 更新记录
1.0.0 包含了大量功能更新与问题修复,例如解决了内存占用过大问题,支持大文件上传、 脱离 SpringBoot 单独使用 等,AmazonS3 和 GoogleCloudStorage 存储平台配置名称与之前版本不兼容,查看 更新记录


📅更新计划

  • 接入存储平台:HDFS、火山云 TOS、Samba、NFS
  • 用户端直传
  • 追加缩略图
  • 列出文件
  • 文件内容预加载
  • 新增 Access 模块,尝试通过 HTTP、FTP、WebDAV 等协议对外提供接口,方便其它程序使用

📦使用

点击 快速入门 查看全部存储平台的使用方法!

🔧 配置

这里以阿里云 OSS 为例,pom.xml 引入本项目,这里默认是 SpringBoot 环境,其它环境参考 脱离 SpringBoot 单独使用

<!-- 引入本项目 -->
<dependency>
    <groupId>org.dromara.x-file-storage</groupId>
    <artifactId>x-file-storage-spring</artifactId>
    <version>2.1.0</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、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/") //保存到相对路径下,为了方便管理,不需要可以不写
                .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

🐞提供bug反馈或建议

提交问题反馈请说明正在 X File Storage 版本、相关依赖库版本、配置参数及问题代码

Gitee issue
GitHub issue

🧬贡献代码的步骤

  1. 在 Gitee 或者 Github 上 fork 项目到自己的 repo
  2. 把 fork 过去的项目也就是你的项目 clone 到你的本地
  3. 修改代码(记得一定要修改 dev 分支)
  4. commit后push到自己的库( dev 分支)
  5. 登录 Gitee 或 Github 在你首页可以看到一个 pull request 按钮,点击它,填写一些说明信息,然后提交即可
  6. 等待维护者合并

🧬 开发约定 & 配置

  1. JDK 11+、Maven 3.8.1+
  2. 代码风格,目前代码风格通过 spotless-maven-plugin + palantir-java-format 统一控制,Maven 构建时统一格式化代码
  3. 在开发阶段,IDE 要识别到 spotless-maven-plugin + palantir-java-format 需要安装插件:palantir-java-format

📐PR遵照的原则

欢迎任何人为 X File Storage 添砖加瓦,贡献代码,为了易用性和可维护性,需要提交的 pr(pull request)符合一些规范,规范如下:

  1. 逻辑清晰、注释完备,不易理解的代码段的说明等信息,必要时请添加单元测试,如果愿意,也可以加上你的大名
  2. 提交到 dev 分支,main 分支不接受任何 pr 或修改
  3. 如果我们关闭了你的 issues 或者 pr 请查看回复内容,我们会在回复中做出解释

📋使用公司及组织登记

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 或捐赠请作者吃包辣条~,不想打赏的话用支付宝扫最后一个码可以领取个红包,在此表示感谢^_^

微信 支付宝 支付宝2 饿了么 美团外卖

或者点击以下链接,将页面拉到最下方点击“捐赠”即可

Gitee上捐赠


🌶️VIP交流群

扫描上方二维码捐赠 99 元,截图发我 QQ1171736840 即可加入 VIP 交流群(超过一年则需要再次捐赠,否则将进行清退)

也可以点击添加免费交流群 515706495 一起交流

x-file-storage's People

Contributors

1171736840 avatar desertsurge avatar kytrun avatar tonycody avatar witt-bit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

x-file-storage's Issues

上传图片后,下载图片打不开

代码如下

  /**
     * 上传文件,成功返回文件 url
     */
    @PostMapping("/upload/{type}")
    public String uploadFile(@PathVariable("type") String type, MultipartFile file) {
//        String datePath=DateUtil.format(new Date(),"/yyyy/MM/dd/");
        FileInfo fileInfo = fileStorageService.of(file)
//                .setPath(type.concat(datePath)) //保存到相对路径下,为了方便管理,不需要可以不写
                .setPath("/".concat(type).concat("/")) //保存到相对路径下,为了方便管理,不需要可以不写
                .setObjectId("0")   //关联对象id,为了方便管理,不需要可以不写
                .setObjectType(type) //关联对象类型,为了方便管理,不需要可以不写
                .upload();  //将文件上传到对应地方
        return fileInfo == null ? "上传失败!" : fileInfo.getUrl();
    }

    @GetMapping("files/{type}/**")
    public ResponseEntity<byte[]> downloadFile(@PathVariable("type") String type, HttpServletRequest request) throws IOException {

        FileInfo fileInfo = fileStorageService.getFileInfoByUrl(request.getRequestURL().toString());
        if (ObjectUtil.isEmpty(fileInfo)){
            throw new BusinessException("500","文件不存在");
        }
        if (!fileStorageService.exists(fileInfo)){
            throw new BusinessException("500","文件不存在!");
        }
        byte[] bytes = null;
        try {
            bytes = fileStorageService.download(fileInfo).bytes();
        }catch (Exception e){
            log.info("文件下载失败!URL:{}, exception:{}",request.getRequestURL(),e.getMessage());
        }

        Assert.notNull(bytes,"文件下载失败!");
        log.info("文件下载成功,文件大小:{}",bytes.length);
        String dfileName = new String(fileInfo.getFilename().getBytes("UTF-8"), "UTF-8");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//        headers.setContentType(MediaType.IMAGE_PNG);
        headers.setContentDisposition(ContentDisposition.attachment().filename(dfileName).build());
        return new ResponseEntity<>(bytes, headers, HttpStatus.CREATED);
    }

问题描述: 在上传后,查看上传文件夹下图片是正常的,下载后,打不开了

阿里云oss 上传报错

错误信息

16:54:17.344  [][main] INFO c.s.a.h.p.integration.oss.LogFileStorageAspect.uploadAround 30  - 上传文件 before -> FileInfo(id=null, url=null, size=160128, filename=6475b9b92460eb2e32f68146.mp3, originalFilename=1663468859912491008.mp3, basePath=null, path=20230530/, ext=mp3, contentType=audio/mpeg, platform=aliyun-oss-1, thUrl=null, thFilename=null, thSize=null, thContentType=null, objectId=null, objectType=null, attr={}, createTime=Tue May 30 16:54:16 CST 2023)
16:54:17.888  [][main] WARN com.aliyun.oss.logException 70  - [Server]Unable to execute HTTP request: Your browser sent a request that this server could not understand.
[ErrorCode]: BadRequest
[RequestId]: 6475B9B97F57C53233483066
[HostId]: localhost
[ResponseError]:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>BadRequest</Code>
  <Message>Your browser sent a request that this server could not understand.</Message>
  <RequestId>6475B9B97F57C53233483066</RequestId>
  <HostId>localhost</HostId>
</Error>


com.aliyun.oss.OSSException: Your browser sent a request that this server could not understand.
[ErrorCode]: BadRequest
[RequestId]: 6475B9B97F57C53233483066
[HostId]: localhost
[ResponseError]:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>BadRequest</Code>
  <Message>Your browser sent a request that this server could not understand.</Message>
  <RequestId>6475B9B97F57C53233483066</RequestId>
  <HostId>localhost</HostId>
</Error>

文档中推荐的MIME类型长度过短

-- 这里使用的是 mysql
CREATE TABLE file_detail
(
id varchar(32) NOT NULL COMMENT '文件id',
url varchar(512) NOT NULL COMMENT '文件访问地址',
size bigint(20) DEFAULT NULL COMMENT '文件大小,单位字节',
filename varchar(256) DEFAULT NULL COMMENT '文件名称',
original_filename varchar(256) DEFAULT NULL COMMENT '原始文件名',
base_path varchar(256) DEFAULT NULL COMMENT '基础存储路径',
path varchar(256) DEFAULT NULL COMMENT '存储路径',
ext varchar(32) DEFAULT NULL COMMENT '文件扩展名',
content_type varchar(32) DEFAULT NULL COMMENT 'MIME类型',
platform varchar(32) DEFAULT NULL COMMENT '存储平台',
th_url varchar(512) DEFAULT NULL COMMENT '缩略图访问路径',
th_filename varchar(256) DEFAULT NULL COMMENT '缩略图名称',
th_size bigint(20) DEFAULT NULL COMMENT '缩略图大小,单位字节',
th_content_type varchar(32) DEFAULT NULL COMMENT '缩略图MIME类型',
object_id varchar(32) DEFAULT NULL COMMENT '文件所属对象id',
object_type varchar(32) DEFAULT NULL COMMENT '文件所属对象类型,例如用户头像,评价图片',
attr text COMMENT '附加属性',
create_time datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8
ROW_FORMAT = DYNAMIC COMMENT ='文件记录表';

这是文档中提供的脚本。
但是实际使用的时候,有些文件的content_type很长,比如application/vnd.openxmlformats-officedocument.presentationml.presentation

32根本存不进。建议修改下文档。

没法设置上传content-type.

因为有的文件希望上传上去后,给的链接打开是直接下载,或者要求直接渲染到浏览器。

急!!

本地存储,enable-access: true,导致资源文件404

enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高) 
domain: "" # 访问域名 

本地存储,这样配置后,启动项目,静态文件全部404。这个是干嘛的?对项目有侵入性,能否优化下?

使用8版本以上的minio可能会有的问题

okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody;
解决方法为在pom中
覆盖SpringBoot中okhttp3的旧版本声明,解决MinIO 8.4.x的依赖冲突
<okhttp3.version>4.10.0</okhttp3.version>

从数据库动态配置,上传提示:没有找到对应的存储平台

由于业务需求关系,不能将云存储的配置信息写死在l配置文件中,需要从数据库中读取配置信息然后动态配置。根据文档用以下代码测试,返回提示:没有找到对应的存储平台。相关代码如下:

                // 默认使用七牛云
                QiniuKodoFileStorage storage = new QiniuKodoFileStorage();
                storage.setPlatform("qiniu-oss-1");
                storage.setBasePath("demo/");
                storage.setDomain(platform.getDomain());
                storage.setBucketName(platform.getBucketName());
                storage.setAccessKey(platform.getAk());
                storage.setAccessKey(platform.getSk());
                list.add(storage);
                log.info("---------------------- the list ---------------------- {}", list);
                FileInfo fileInfo =  fileStorageService.of(file)
                .setPlatform("qiniu-kodo-1")    // 使用指定的存储平台
                .upload();
                R.ok(fileInfo);

集群minio 无法获取图片访问路径

上传图片后 返回的图片地址实际上为,图片所在服务的代理地址,如果是集群minio ,图片就会被分片,这种情况如何拿到访问图片的地址?

启动就提示:FileRecorder 的实现类未找到

cn.xuyanwu.spring.file.storage.FileStorageAutoConfiguration [FileStorageAutoConfiguration.java:352] 没有找到 FileRecorder 的实现类,文件上传之外的部分功能无法正常使用,必须实现该接口才能使用完整功能!

下载为空

通过url下载文件 返回空指针是什么情况?

没有 ObjectMetadata.contentLength 上传 WARN

七牛云文件删除问题

在使用七牛云作为文件云存储时,发生了通过url无法删除的情况,但是调用删除方法时返回的状态为成功,下图可以看出当前默认的platform(指我的系统中的默认文件存储平台)是没有问题的。
image
image

建议

可以把fastdfs也集成进去。

fileStorageService判断文件是否存在走的是DefaultFileRecorder返回null,导致无法走到具体的exists直接返回为false

如题:
fileStorageService判断文件是否存在走的是DefaultFileRecorder返回null,导致无法走到具体的exists直接返回为false
image
,看文档,

如果还想使用除了保存文件之外的其它功能,例如删除、下载文件,还需要实现 FileRecorder 这个接口,把文件信息保存到数据库中。

是要实现该接口吗,不使用数据库保存,可以用该方法(exist)吗

好像跟undertow不兼容

按文档配置报错
cn.xuyanwu.spring.file.storage.exception.FileStorageRuntimeException
Caused by: java.nio.file.FileAlreadyExistsException

AWS S3不支持创建存储空间功能 是么

The location constraint is incompatible for the region specific endpoint this request was sent to.

有没有遇到过这样的bug 我用s3连接华为的obs 报这个错 不知道怎么配置region

ftp下载特别慢

看了一下原因,每次下载都会去登录,建议做一个连接池改造

怎么对你的方法进行重写啊,我写了子类继承你这个类

怎么对你的方法进行重写啊,我写了子类继承你这个类

class S3FileStroage extends AwsS3FileStorage

@OverRide
public AmazonS3 getClient() {
if (client == null) {
AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)));
if (StrUtil.isNotBlank(endPoint)) {
builder.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, region));
} else if (StrUtil.isNotBlank(region)) {
builder.withRegion(region);
}
builder.withPathStyleAccessEnabled(true);
client = builder.build();
}
return client;
}

重写你这个方法加上了 builder.withPathStyleAccessEnabled(true); 但是还是走的你的代码,我这个没有生效,怎么能让我写的子类覆盖父类的方法啊

配置本地上传模式报路径错误

调用cn.xuyanwu.spring.file.storage.MultipartFileWrapper#transferTo(java.io.File)发生以下错误:
Caused by: java.io.FileNotFoundException: C:\Users\xxx\AppData\Local\Temp\F:\data\files\lili\6464503dc35b9c95ee475398.jpg (文件名、目录名或卷标语法不正确。)

Debug定位发现在jetty-util-9.4.27.v20200227.jar版本下,调用接口Part.write实现方法没做路径是否相对绝对判断,new File时直接使用了MultiPartFormInputStream.this._tmpDir。

org.eclipse.jetty.util.MultiPartInputStreamParser.MultiPart#write(java.lang.String)

public void write(String fileName) throws IOException {
            if (this._file == null) {
                this._temporary = false;
                this._file = new File(MultiPartFormInputStream.this._tmpDir, fileName);
                try {
                    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(this._file));
                    try {
                        this._bout.writeTo(bos);
                        bos.flush();
                    } catch (Throwable var10) {
                        try {
                            bos.close();
                        } catch (Throwable var9) {
                            var10.addSuppressed(var9);
                        }
                        throw var10;
                    }
                    bos.close();
                } finally {
                    this._bout = null;
                }
            } else {
                this._temporary = false;
                Path src = this._file.toPath();
                Path target = src.resolveSibling(fileName);
                Files.move(src, target, StandardCopyOption.REPLACE_EXISTING);
                this._file = target.toFile();
            }
        }

修复可参考:https://blog.csdn.net/mar5342/article/details/108127356

自动生成contentType,在minio中报错

自动生成contentType,在minio中报错。
这段代码获取不到excel文档的类型,所以报错了
URLConnection.guessContentTypeFromName(fileInfo.getFilename())
建议修改用apache Tika做mime猜测

建议:优化一下路径配置方案

在路径和域名配置的时候可以不加最后的【/】,而是该项目在拼接路径的时候自动加上【/】,为了避免出现两个及以上的斜杆,通过replace进行替换为1个,这样处理有利于防呆设计和满足不同人的编写习惯

minio上传后返回的url无法预览

minio在上传后返回了
domain/base-path/filename
如 http://192.168.177.188:9000/test/upload/63f703a21ccab5c9cd06e8bd.txt

配置如下:
end-point: http://192.168.177.188:9000
bucket-name: test-bucket
domain: "http://192.168.177.188:9000/" # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
base-path: test/ # 基础路径

这是哪里的问题,或者是domain设置不正确,期待回答

它这个是不是应该还有bucket的路径,然后在minio设置bucket为公共的就可以访问,那么如何在私有模式下可以呢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.