dromara/x-file-storage

脱离 SpringBoot 单独使用的话文件适配器缺少MultipartFileWrapper类型文件

Closed this issue · 2 comments

自己编写代码MultipartFileWrapper.java和MultipartFileWrapperAdapter.java 按照官网注入spirngbean还是没加载到FileStorageService类下的private CopyOnWriteArrayList fileWrapperAdapterList集合中, 说明之所用脱离使用,是因为公司springboot是1.5的版本公司内部封装的框架启动类加@EnableFileStorage注解就会报错

解决方案
`package tangweihao.test.config;

import cn.hutool.core.io.FileUtil;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.dromara.x.file.storage.core.exception.FileStorageRuntimeException;
import org.dromara.x.file.storage.core.file.FileWrapper;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**

  • Multipart 文件包装类
    */
    @getter
    @Setter
    @NoArgsConstructor
    public class MultipartFileWrapper implements FileWrapper {
    private MultipartFile file;
    private String name;
    private String contentType;
    private InputStream inputStream;
    private Long size;

    public MultipartFileWrapper(MultipartFile file,String name,String contentType,Long size) {
    this.file = file;
    this.name = name;
    this.contentType = contentType;
    this.size = size;
    }

    @OverRide
    public InputStream getInputStream() throws IOException {
    if (inputStream == null) {
    inputStream = new BufferedInputStream(file.getInputStream());
    }
    return inputStream;
    }

    @OverRide
    public void transferTo(File dest) {
    // 在某些 SpringBoot 版本中,例如 2.4.6,此方法会调用失败,
    // 此时尝试手动将 InputStream 写入指定文件,
    // 根据文档来看 MultipartFile 最终都会由框架从临时目录中删除
    try {
    file.transferTo(dest);
    } catch (Exception ignored) {
    try {
    FileUtil.writeFromStream(getInputStream(),dest);
    } catch (Exception e) {
    throw new FileStorageRuntimeException("文件移动失败",e);
    }
    }
    }

    @OverRide
    public boolean supportTransfer() {
    return true;
    }

}
`

`package tangweihao.test.config;

import lombok.Getter;
import lombok.Setter;
import org.dromara.x.file.storage.core.file.ByteFileWrapperAdapter;
import org.dromara.x.file.storage.core.file.FileWrapper;
import org.dromara.x.file.storage.core.file.FileWrapperAdapter;
import org.dromara.x.file.storage.core.tika.ContentTypeDetect;
import org.springframework.context.annotation.Bean;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**

  • Multipart 文件包装适配器
    */
    @getter
    @Setter
    public class MultipartFileWrapperAdapter implements FileWrapperAdapter {

    @OverRide
    public boolean isSupport(Object source) {
    return source instanceof MultipartFile || source instanceof MultipartFileWrapper;
    }

    @OverRide
    public FileWrapper getFileWrapper(Object source,String name,String contentType,Long size) throws IOException {
    if (source instanceof MultipartFileWrapper) {
    return updateFileWrapper((MultipartFileWrapper) source,name,contentType,size);
    } else {
    MultipartFile file = (MultipartFile) source;
    if (name == null) {
    name = file.getOriginalFilename();
    }
    if (contentType == null) {
    contentType = file.getContentType();
    }
    if (size == null) {
    size = file.getSize();
    }
    return new MultipartFileWrapper(file,name,contentType,size);
    }
    }
    }

package tangweihao.test.config;

import org.dromara.x.file.storage.core.FileStorageProperties;
import org.dromara.x.file.storage.core.FileStorageService;
import org.dromara.x.file.storage.core.FileStorageServiceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Collections;

@configuration
public class FileStorageServiceConfig {

@Bean
public FileStorageService fileStorageService() {
    // 在这里进行初始化操作,可以使用你提供的代码
    FileStorageProperties properties = new FileStorageProperties();
    properties.setDefaultPlatform("huawei-obs-1");
    FileStorageProperties.HuaweiObsConfig huaweiObsConfig = new FileStorageProperties.HuaweiObsConfig();
    huaweiObsConfig.setPlatform("huawei-obs-1");
    huaweiObsConfig.setAccessKey("T**********N");
    huaweiObsConfig.setSecretKey("J******************************ry");
    huaweiObsConfig.setBucketName("smal-lhowe");
    huaweiObsConfig.setEndPoint("https://obs.cn-east-3.myhuaweicloud.com");
    huaweiObsConfig.setDomain("http://abc.obs.com/");
    properties.setHuaweiObs(Collections.singletonList(huaweiObsConfig));
    FileStorageServiceBuilder fileStorageServiceBuilder = FileStorageServiceBuilder.create(properties);
    fileStorageServiceBuilder.getFileWrapperAdapterList().add(new MultipartFileWrapperAdapter());
    fileStorageServiceBuilder.addFileWrapperAdapter(new MultipartFileWrapperAdapter());
    return fileStorageServiceBuilder.useDefault().build();
}

}
`

你这样,还是引入 x-file-storage-spring 这个依赖,这里有 MultipartFileWrapper 以及适配器,然后不要使用 @EnableFileStorage 这个注解,再手动初始化就行

先在启动类上引入以下注解

@Import({SpringFileStorageProperties.class})

再初始化

@Configuration
public class FileStorageAutoConfiguration2 {

    @Autowired
    private SpringFileStorageProperties properties;

    @Bean
    public FileStorageService fileStorageService() {

        // 创建,自定义存储平台、 Client 工厂、切面等功能都有对应的添加方法
        return FileStorageServiceBuilder.create(properties.toFileStorageProperties())
                .useDefault()
                .addFileWrapperAdapter(new MultipartFileWrapperAdapter())
                .build();
    }
}