package cn.cslg.pas.service; import cn.cslg.pas.common.model.dto.FMSDeleteFileDTO; import com.google.gson.Gson; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.FileCopyUtils; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; import static cn.hutool.core.io.FileUtil.getMimeType; /** * Okhttp调用FMS上传文件接口 * * @Author xiexiang * @Date 2023/8/10 */ @RequiredArgsConstructor @Slf4j @Service public class FileManagerService { @Value("${authorUrl}") private String PCSUrl; @Value("${OPSUrl}") private String OPSUrl; @Value("${PASUrl}") private String PASUrl; @Value("${RMSUrl}") private String RMSUrl; @Value("${FMSUrl}") private String FMSUrl; public String uploadFile(List multipartFiles, Integer sourceId) throws IOException { List files = new ArrayList<>(); for (MultipartFile multipartFile : multipartFiles) { File file = new File(multipartFile.getOriginalFilename()); FileCopyUtils.copy(multipartFile.getBytes(), file); files.add(file); } MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder() .setType(MultipartBody.FORM); for (File file : files) { //根据文件名获取文件的MIME类型 String mimeType = getMimeType(file.getPath()); multipartBodyBuilder.addFormDataPart("files", file.getName(), RequestBody.create(MediaType.parse(mimeType), file)); } RequestBody requestBody = multipartBodyBuilder .addFormDataPart("sourceId", String.valueOf(sourceId)) .build(); OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build(); Request request = new Request.Builder() .url(FMSUrl + "/fileManager/uploadSystemFile") .post(requestBody) .build(); return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string(); } /** * 调用文件系统取出文件接口(获得文件流) * * @param fieldId 文件id */ public byte[] downloadSystemFileFromFMS(Integer fieldId) throws IOException { OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build(); Request request = new Request.Builder() .url(FMSUrl + "/fileManager/downloadSystemFile?fileId=" + fieldId) .get() .build(); return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).bytes(); } /** * 调用文件系统获取文件信息接口 * * @return * @throws IOException */ public String getSystemFileFromFMS(List fileIds) throws IOException { String param = new Gson().toJson(fileIds); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param); OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build(); Request request = new Request.Builder() .url(FMSUrl + "/fileManager/getFileData") .post(requestBody) .build(); return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string(); } /** * 调用文件系统删除接口 * * @return * @throws IOException */ public String deleteFileFromFMS(FMSDeleteFileDTO fmsDeleteFileDTO) throws IOException { String param = new Gson().toJson(fmsDeleteFileDTO); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param); OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build(); Request request = new Request.Builder() .url(FMSUrl + "/fileManager/deleteSystemFile") .post(requestBody) .build(); return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string(); } }