EasyExcel 导出文件上传文件服务器

407 阅读1分钟

EasyExcel 导出文件上传服务器 multipartBody

EasyExcel 导出的文件App端不能处理 OutputStream时,需要上传服务器后,在将路径返回前端。

1、EasyExcel 导出时 ByteArrayOutputStream 接收

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
EasyExcel.write(byteArrayOutputStream, CentralizedExportVO.class)
        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
        .sheet()
        .doWrite(data);
 fileUrl = fileService.upLoad(byteArrayOutputStream, "导出文件中文名称", fileNameStr);

2、在将 ByteArrayOutputStream 写入到 MultipartBody 中,在借助 OkHttpClient上传一下。


import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.util.UriUtils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * 文件处理实现类
 * @author naixin.zhang
 * Date  2023/10/24 10:12
 */
@Slf4j
@Service
public class FileService {

   @Value("${上传服务器地址}")
   private String goFastUrl;
   private final OkHttpClient okHttpClient = new OkHttpClient();


    /**
     * 上传文件
     * @param byteArrayOutputStream  输出流
     * @param chainName  替换需转移中文名字
     * @param fileNameStr 文件全名
     * @return
     */
    public String upLoad(ByteArrayOutputStream byteArrayOutputStream, String chainName, String fileNameStr){

        String fileUrl = "";
        MultipartBody multipartBody;
        try {
            multipartBody = new MultipartBody.Builder().
                    setType(MultipartBody.FORM)
                    .addFormDataPart("file", fileNameStr,
                            RequestBody.create(MediaType.parse("multipart/form-data;charset=utf-8"),
                                            byteArrayOutputStream.toByteArray()))
                    .addFormDataPart("output", "json")
                    .build();
        } catch (Exception e) {
            log.error("upload file error", e);
            return null;
        }
        Request request = new Request.Builder()
                .url(goFastUrl)
                .post(multipartBody)
                .build();

        try (Response response = okHttpClient.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                return null;
            }
            ResponseBody body = response.body();
            if (body == null) {
                return null;
            }
            String result = body.string();
            if (StringUtils.isNotEmpty(result)) {
                JSONObject bodyJson = JSONObject.parseObject(result);
                log.debug("上传文件返回对象 ->{}", bodyJson.toJSONString());
                String url = bodyJson.getString("url");
                log.info("导出文件路径 ->{}", url);
                // 转义中文路径
                String exportFileName = UriUtils.encode(chainName, "UTF-8");
                // 中文路径替换成转义后的中文路径
                fileUrl = url.replaceAll(chainName, exportFileName);
            }
        } catch (IOException e) {
            log.warn("upload file error", e);
            return null;
        }
        return fileUrl;
    }


}

希望能帮助到大家!