Dicas Java: solicitação http para transferir fluxo de arquivos

No projeto, as imagens precisam ser transmitidas a terceiros. A interface da outra parte requer a transmissão de fluxos de arquivos em vez da codificação base64 comumente usada.

import com.alibaba.fastjson.JSONObject;
import com.leyue100.common.util.StringUtils;
import lombok.extern.slf4j.Slf4j;

import javax.activation.MimetypesFileTypeMap;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

@Slf4j
public class FileUploadUtil {
    
    

	public static void main(String[] args) {
    
    
        try {
    
    
            Map<String, String> filePathMap = new HashMap<>();
            String url = "";
            filePathMap.put("2345678", "/上传.jpg");
            String result = fileUpload(url, "id","2345",filePathMap");
            log.info("影像上传接口返回参数" + JSONObject.toJSONString(result));
        } catch (Exception e) {
    
    
            log.error("财信上传文件系统异常!fileUpload", e);
            throw e;
        }
    }
    
    /**
     * 影像上传接口
     *
     * @param relaid
     */
    public static String fileUpload(String url, String seqId, String imgList, Map<String, String> fileMap) {
    
    
        try {
    
    
            Map<String, Object> textMap = new HashMap<String, Object>();
            //可以设置多个input的name,value
            textMap.put("seqId", seqId);
            textMap.put("imglist", imgList);
            log.info("上传接口请求参数" + textMap.toString());
            String result = formUpload(url, textMap, fileMap, ".jpg");
            log.info("上传接口返回参数" + JSONObject.toJSONString(result));
            return result;
        } catch (Exception e) {
    
    
            log.error("上传文件系统异常!fileUpload", e);
            throw e;
        }
    }

  
    /**
     * 功能描述:删除已经上传的文件
     *
     * @author songchengye
     * @date 2022/4/8 下午6:18
     */
    public static void removeFile(Map<String, String> fileMap) {
    
    
        if (fileMap != null) {
    
    
            Iterator iter = fileMap.entrySet().iterator();
            while (iter.hasNext()) {
    
    
                Map.Entry entry = (Map.Entry) iter.next();
                String inputValue = (String) entry.getValue();
                if (inputValue == null) {
    
    
                    continue;
                }
                File file = new File(inputValue);
                file.delete();
            }
        }
    }

    @SuppressWarnings("rawtypes")
    public static String formUpload(String urlStr, Map<String, Object> textMap,
                                    Map<String, String> fileMap, String contentType) {
    
    
        String res = "";
        HttpURLConnection conn = null;
        // boundary就是request头和上传文件内容的分隔符
        String BOUNDARY = "---------------------------123821742118716";
        try {
    
    
            URL url = new URL(urlStr);
            conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(30000);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("requestId", StringUtils.getLyRandomUUID());
            conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
            OutputStream out = new DataOutputStream(conn.getOutputStream());
            // text
            if (textMap != null) {
    
    
                StringBuffer strBuf = new StringBuffer();
                Iterator iter = textMap.entrySet().iterator();
                while (iter.hasNext()) {
    
    
                    Map.Entry entry = (Map.Entry) iter.next();
                    String inputName = (String) entry.getKey();
                    String inputValue = (String) entry.getValue();
                    if (inputValue == null) {
    
    
                        continue;
                    }
                    strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");
                    strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n");
                    strBuf.append(inputValue);
                }
                out.write(strBuf.toString().getBytes());
            }
            // file
            if (fileMap != null) {
    
    
                Iterator iter = fileMap.entrySet().iterator();
                while (iter.hasNext()) {
    
    
                    Map.Entry entry = (Map.Entry) iter.next();
                    String inputName = (String) entry.getKey();
                    String inputValue = (String) entry.getValue();
                    if (inputValue == null) {
    
    
                        continue;
                    }
                    File file = new File(inputValue);
                    String filename = file.getName();

                    //没有传入文件类型,同时根据文件获取不到类型,默认采用application/octet-stream
                    contentType = new MimetypesFileTypeMap().getContentType(file);
                    //contentType非空采用filename匹配默认的图片类型
                    if (!"".equals(contentType)) {
    
    
                        if (filename.endsWith(".png")) {
    
    
                            contentType = "image/png";
                        } else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg") || filename.endsWith(".jpe")) {
    
    
                            contentType = "image/jpeg";
                        } else if (filename.endsWith(".gif")) {
    
    
                            contentType = "image/gif";
                        } else if (filename.endsWith(".ico")) {
    
    
                            contentType = "image/image/x-icon";
                        }
                    }
                    if (contentType == null || "".equals(contentType)) {
    
    
                        contentType = "application/octet-stream";
                    }
                    StringBuffer strBuf = new StringBuffer();
                    strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");
                    strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"; filename=\"" + filename + "\"\r\n");

//                    strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"; filename=\"" + filename + "\"\r\n");
                    strBuf.append("Content-Type:" + contentType + "\r\n\r\n");
                    out.write(strBuf.toString().getBytes());
                    DataInputStream in = new DataInputStream(new FileInputStream(file));
                    int bytes = 0;
                    byte[] bufferOut = new byte[1024];
                    while ((bytes = in.read(bufferOut)) != -1) {
    
    
                        out.write(bufferOut, 0, bytes);
                    }
                    in.close();
                }
            }
            byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
            out.write(endData);
            out.flush();
            out.close();
            // 读取返回数据
            StringBuffer strBuf = new StringBuffer();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
    
    
                strBuf.append(line).append("\n");
            }
            res = strBuf.toString();
            reader.close();
            reader = null;
        } catch (Exception e) {
    
    
            System.out.println("发送POST请求出错。" + urlStr);
            e.printStackTrace();
        } finally {
    
    
            if (conn != null) {
    
    
                conn.disconnect();
                conn = null;
            }
        }
        return res;
    }

}

Link original: https://blog.csdn.net/weixin_43945983/article/details/124126652

おすすめ

転載: blog.csdn.net/weixin_42504805/article/details/132663456