java操作seaweedfs

前置条件是seaweedfs服务已成功启动,具体部署可参考我上篇文章SeaweedFS部署及使用指南

  • 首先导入pom依赖
        <dependency>
            <groupId>net.anumbrella.seaweedfs</groupId>
            <artifactId>seaweedfs-java-client</artifactId>
            <version>0.0.2.RELEASE</version>
        </dependency>
  • 编写SeaweedFS配置类SeaweedFSConfig
@Configuration
public class SeaweedFSConfig {

    @Value("${seaweedfs.host}")
    private String host;
    @Value("${seaweedfs.port}")
    private int port;

    @Bean
    public FileTemplate fileTemplate() {
        FileSource fileSource = new FileSource();
        // SeaweedFS master服务ip地址
        fileSource.setHost(host);
        // SeaweedFS master服务端口
        fileSource.setPort(port);
        try {
            // 启动服务
            fileSource.startup();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new FileTemplate(fileSource.getConnection());
    }
}

我的application.properties配置文件如下:

seaweedfs.host=192.168.1.55 #多个ip地址用逗号隔开
seaweedfs.port=9333
  • 上传文件的方法如下,用的是Spring的JUnit测试:
@Autowired
private FileTemplate template;

@Test
public void testSeaweedFS() throws IOException {
        // 上传可以指定文件名
        FileHandleStatus handleStatus = template.saveFileByStream("new_name.pdf", new FileInputStream(new File("C:\\Users\\xuyan\\Desktop\\test.pdf")));
        // 获取文件ID,可通过这个ID获取到文件
        String fileId = handleStatus.getFileId();
        StreamResponse fileStream = template.getFileStream(fileId);
        InputStream inputStream = fileStream.getInputStream();
        // 获取流之后流拷贝输出到本地
        IOUtils.copy(inputStream,new FileOutputStream(new File("D:/new_name.pdf")));

    }

SeaweedFS 上传附件接口方法2

@Autowired
    private FileTemplate template;
    
    /**
     * @Description: 上传附件接口
     * @Date: 2019/12/19
     */
    @PostMapping("/upload")
    @ApiOperation(value = "上传附件接口", notes = "上传附件,上传成功返回附件id")
    public RestResponse<FileHandleStatus> uploadFile(@RequestParam(name = "fileId",required = false) String fileId, @RequestParam("excelFile") MultipartFile file) throws IOException {
    try {
            if (file.isEmpty()) {
                return RestResponse.fail().setMsg("上传文件不能为空!");
            }
            if (!StringUtils.isEmpty(fileId)){
                return RestResponse.ok(template.updateFileByStream(fileId,file.getOriginalFilename(),file.getInputStream()));
            }
            ContentType contentType = ContentType.create("application/x-www-form-urlencoded", Consts.ISO_8859_1);
            return RestResponse.ok(template.saveFileByStream(file.getOriginalFilename(), file.getInputStream(),contentType));
        } catch (Exception e) {
            logger.error("上传附件失败", e);
            return RestResponse.fail().setMsg("上传附件服务连接关闭");
        }
    }

SeaweedFS  下载附件接口方法2

  @Autowired
    private FileTemplate template;    
 
    /**
     * @Description: 上传附件接口
     * @Date: 2019/12/19
     */
    @GetMapping("/getFileInfo/{fileId}")
    @ApiOperation(value="公共下载附件接口",notes = "公共下载附件接口")
    @ApiImplicitParams(value = {@ApiImplicitParam(name = "fileId", value = "附件id", dataType = "String", required = true)})
    public RestResponse<SeaweedResponse> getFileInfo(@PathVariable String fileId) throws IOException {
        FileHandleStatus status = template.getFileStatus(fileId);
        String name = new String(status.getFileName().substring(8,status.getFileName().length()-1).getBytes("iso-8859-1"),"utf-8");
        SeaweedResponse response = new SeaweedResponse();
        if (status != null){
            response.setFileId(status.getFileId());
            response.setFileName(name);
            response.setFilePath(template.getFileUrl(fileId));
        }
        return RestResponse.ok(response);
    }

ps:   

解决升级seaweed服务器,导致的获取附件名称时get (“Content-Disposition”) 报 NullPointerException 的问题(完善)

/**
     * 获取附件的详情
     * @return
     */
    @GetMapping("/getFileInfo/{fileId}")
    @ApiOperation(value="公共下载附件接口",notes = "下载附件接口")
    @ApiImplicitParams(value = {@ApiImplicitParam(name = "fileId", value = "附件id", dataType = "String", required = true)})
    public RestResponse<SeaweedResponse> getFileInfo(@PathVariable String fileId) throws IOException {
        CloseableHttpClient client = null;
        String name = "未命名";
        try {
            String url = getTemplate().getFileUrl(fileId);
            client = HttpClientBuilder.create().build();
            HttpGet get = new HttpGet(url);
            get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
            HttpResponse response = client.execute(get);
            String s = response.getFirstHeader("Content-Disposition").getValue();
            name = new String(s.substring(18,s.length()-1).getBytes("iso-8859-1"), "utf-8");
        }
        catch (Exception e){
            reConnect();
            logger.error("公共下载附件出错",e);
        }
        finally {
            if(client != null)
            {
                client.close();
            }
        }
 
        SeaweedResponse response = new SeaweedResponse();
        response.setFileId(fileId);
        response.setFileName(name);
        response.setFilePath(getTemplate().getFileUrl(fileId));
        return RestResponse.ok(response);
    }

 

三、SeaweedFS 删除附件接口

   

 @Autowired
    private FileTemplate template;
 
     /**
     * @Description: 上传附件接口
     * @Date: 2019/12/19
     */
    @PostMapping("/delete")
    @ApiOperation(value="公共删除附件接口",notes = "删除附件接口")
    public RestResponse deleteFile(@RequestParam(name = "fileId") String fileId) throws IOException {
        if (StringUtils.isEmpty(fileId)) {
            return RestResponse.fail().setMsg("fileId 参数不能为空");
        }
        template.deleteFile(fileId);
        return RestResponse.ok("删除成功");
    }

 

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Java操作MiniOClient是指使用Java语言编写程序来操作MiniOClient。MiniOClient是一个轻量级的对象存储服务器,类似于Amazon S3或Azure Blob Storage,用于存储和管理大量的对象数据。 在Java操作MiniOClient,需要使用MiniOClient的Java SDK。这个SDK提供了一组API,可以方便地与MiniOClient进行交互。 首先,我们需要在Java中引入MiniOClient的SDK依赖。可以通过Maven或Gradle等构建工具来管理依赖。 然后,我们可以创建一个MiniOClient实例,并与MiniO服务器建立连接。通过传入MiniO服务器的地址、端口、访问密钥等参数来进行连接连接成功后,我们可以使用MiniOClient对象来进行各种操作,如上传、下载、删除、复制、重命名等。 例如,要上传一个文件到MiniO服务器,可以使用MiniOClient的`putObject`方法。我们需要指定要上传的文件路径、MiniO服务器中的桶(Bucket)名称以及要存储的对象(Object)名称。上传成功后,我们可以通过`getObjectUrl`方法获取上传后文件在MiniO服务器中的URL。 另外,MiniOClient还提供了丰富的配置选项,可以根据需求设置不同的参数,如连接超时时间、最大重试次数等。 在操作MiniOClient时,需要注意保护访问密钥的安全性,以免被他人恶意使用。可以使用加密传输和安全验证等方式来增强安全性。 总而言之,通过Java操作MiniOClient可以方便地进行对象存储的各种操作,帮助我们有效地管理大量的对象数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值