Administrator
发布于 2024-10-09 / 9 阅读
0
0

Upload File

commons-fileupload

    <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.5</version>
    </dependency>

Commons-FileUpload组件的API

ServletFileUpload

void setSizeMax(long sizeMax)	设置请求信息内容的最大允许字节数
List parseRequest(HttpServletRequest request)	解析form表单提交的数据,返回一个FileItem实例的集合
static final boolean isMultipartContent(HttpServletRequest request)	判断请求提交的方式是否是“multipart/form-data”类型
void setHeaderEncoding(String encoding)	设置转换时所使用的字符集编码

FileItem

FileItem接口,用于封装单个表单字段元素的数据,每一个表单字段都对应一个FileItem实例,在应用程序中使用的是其实现类DiskFileItem。FileItem接口提供的常用方法如下:


public boolean isFormField()	判断FileItem对象所封装的数据类型,普通表单字段返回true,文件表单字段返回false
public String getName()	获得文件字段中所上传的文件名,普通表单字段调用此方法返回null
public String getFieldName()	返回表单字段元素的name属性值
public void write(File file)	将FileItem对象中保存的文件数据内容写入到指定的文件中
public String getString()	将FileItem对象中保存的主体内容以一个字符串返回,其有一个重载方法getString(String encoding),可指定所采用的编码集
public long getSize()	返回单个上传文件的字节数

FileItemFactory

FileItemFactory接口与其实现类DiskFileItemFactory,创建ServletFileUpload实例需要依赖FileItemFactory工厂接口,DiskFileItemFactory是此接口的实现类,主要有两个常用方法:

public void setSizeThreshold(int sizeThreshold)	设置内存缓冲区的大小
public void setRepositoryPath(String path)	设置临时文件存放的目录

MultipartFile & File & Byte[]

  • MultipartFile是 Spring 框架的一部分,File是 Java 标准库的一部分。
  • MultipartFile主要用于接收上传的文件,File主要用于操作系统文件。
  • MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含 二进制数据 + 文件名称 + content-type
package org.springframework.web.multipart;

public interface MultipartFile extends InputStreamSource {

    String getName();
    
    String getContentType();
    
    long getSize();

    InputStream getInputStream() throws IOException;
    
}

MultipartFile常见的实现类:

image-20241009083324511

Byte[]转MultipartFile

需要借助commons-fileupload依赖包

    <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.5</version>
    </dependency>

代码如下:

 public MultipartFile convertByteToMultipartFile(byte[] dataArray, String fileName) throws Exception {
        if (Objects.isNull(dataArray)) {
            throw new Exception("字节数组为空");
        }
        
        // 这里的contentType可以自定义
        String contentType = "application/octet-stream";

        FileItem item;
        try {
            FileItemFactory factory = new DiskFileItemFactory();
            item = factory.createItem("file", contentType, false, fileName);

            try (ByteArrayOutputStream bos = new ByteArrayOutputStream(dataArray.length);
                 OutputStream os = item.getOutputStream()) {

                bos.write(dataArray);
                os.write(bos.toByteArray());
            }
            return new CommonsMultipartFile(item);
        } catch (IOException e) {
            throw e;
        }
    }

File转MultipartFile

需要借助commons-fileupload依赖包

    <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.5</version>
    </dependency>

代码如下:

public MultipartFile convertFileToMultipartFile(File file, String fileName) throws Exception {

        String contentType = "application/octet-stream";
        FileItem item;
        try {
            FileItemFactory factory = new DiskFileItemFactory();
            item = factory.createItem("file", contentType, false, fileName);

            try (FileInputStream fileInputStream = new FileInputStream(file);
                 OutputStream outputStream = item.getOutputStream()) {
                IOUtils.copyLarge(fileInputStream, outputStream);
            }

            return new CommonsMultipartFile(item);
        } catch (IOException e) {
            throw e;
        }
    }

评论