java小知识:http请求传输文件流

2023-05-16

前文:项目里要给第三方传输图片,对方接口要求传文件流,而不是常用的base64编码,在此记录一下~

直接贴代码吧:

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;
    }

}

就不在这里写单元测试了,有不明白的可以留言。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java小知识:http请求传输文件流 的相关文章

  • 解决android studio错误提示信息乱码问题

    android studio在编译过程中 xff0c 如果出现错误会在messages界面给出提示 xff0c 但是有的时候会出现乱码的问题 导致根本看不出来是什么问题 这时候只要做以下设置就能解决乱码问题 xff0c IDE也会将出现的错
  • Python为什么是编程语言中最skr的?

    Python的出现让计算机编程语言不再是生僻的专业技能 xff0c 而是常人都能学习和使用的万金油 经济学人 xff08 Economist xff09 近日对Python的一篇专题报道 xff0c 揭秘了这一把计算机思维带入寻常百姓家的神
  • PLC有几种编程语言?各有什么特点?

    之前我们简单学习了PLC的一些基本知识 今天我们再来了解PLC的编程语言吧 IEC 1131 3的编程语言是IEC工作组对世界范围的PLC厂家的编程语言合理地吸收 借鉴的基础上形成的一套针对工业控制系统的国际编程语言标准 xff0c 它不但
  • 几种主流编程语言

    著名风险投资家Marc Andreessen曾说 xff1a 软件正在吞噬整个世界 没错 xff0c 开发软件的公司越来越多了 xff0c 会编程的人也越来越多了 xff0c 现在的世界上光编程语言就达成千上万种 xff0c 尽管这其中只有
  • VB编程语言基础知识点总结(转)

    Visual Basic xff08 简称VB xff09 是Microsoft公司开发的一种通用的基于对象的程序设计语言 xff0c 为结构化的 模块化的 面向对象的 包含协助开发环境的事件驱动为机制的可视化程序设计语言 海风教育投诉 海
  • 如何学习SCL语言?SCL语言编程入门

    随着现代工控技术的不断发展 xff0c 可能很多使用过 PLC 的技术人员都有这么一个感受 xff1a 传统的 梯形图 编程方式在面对越来越复杂的控制要求时 xff0c 已显得力不从心 海风教育投诉 海风教育在线辅导0元一对一试听课等你来领
  • 量子计算机有多可怕 一秒破译全世界所有密码!

    导语 xff1a 最近半年以来 xff0c 人工智能的发展重心逐渐从云端向终端转移 xff0c 相伴而生的是全新一代的计算芯片产业全面崛起 智东西历经数月 xff0c 首次对包括AI芯片在内的新一代计算芯片全产业链上下近百间核心企业进行报道
  • 十大编程语言都有哪些?学哪种比较好?

    很多同学想转行编程 xff0c 但是那么多的编程语言到底该怎么选呢 xff1f 头疼 如果你是一名具有前瞻性的开发者或者想成为一名具有前瞻能力的开发者的话 xff0c 那么 xff0c 你应该至少在最好的编程语言中选择一个 xff0c 类似
  • 偏导数,雅可比矩阵(jacobi matrix),黑塞矩阵(Hessian matrix)

    这里我们大致地复习一下偏导数 xff0c 雅克比矩阵以及黑塞矩阵的定义和关系 导数向量与雅克比矩阵 xff08 Jacobi matrix xff09 函数的某个因变量对某个自变量求的导数即为它们关于函数的偏导数 当因变量为一元的情况下 x
  • 数据挖掘-Matplotlib画图示例1---操作多画布plt.subplots

    数据挖掘Matplotlib 画图示例 plt plot 折线图 import random import matplotlib pyplot as plt 这个是解决中文编码问题的 方法一 plt rcParams 39 font san
  • HIVE操作语句--DDL篇

    未经允许 xff0c 禁止转载 xff0c 一经发现 xff0c 必定严究 HIVE 1 1 创建数据库1 2 查看所有数据库1 3 查看数据库信息1 xff09 显示数据库信息2 xff09 显示数据库详细信息 1 4 删除数据库1 xf
  • 关于studio编译过程中出现的Execution failed for task ':maodiandian:processDebugManifest'

    android studio在编译过程中 xff0c 由于添加第三方的依赖 可能导致manifest文件和并失败 xff0c 报以以下错误 xff1a org gradle api tasks TaskExecutionException
  • 阿里云 腾讯云 服务器Ubuntu 20.04安装图形界面,解决灰屏问题,解决复制粘贴问题,并调整分辨率大小

    参考 xff1a https blog csdn net weixin 39278265 article details 118641412 https help aliyun com document detail 59330 html
  • 守护进程

    5 守护进程 守护进程 daemon 是生存期长的一种进程 它们常常在系统引导装入时启动 xff0c 仅在系统关闭时才终止 因为它们没有控制终端 xff0c 所以说它们是在后台运行的 UNIX系统有很多守护进程 xff0c 它们执行日常事务
  • ubuntu 安装flameshot截图软件及设置快捷键

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 flameshot安装命令安装源码安装 二 设置快捷键 前言 Ubuntu自带的截图功能并不能满足日常所需 xff0c
  • 虚拟机里重装Ubuntu系统并配置深度学习环境

    1 下载VMware xff0c 下载Ubuntu镜像文件 2 安装VMware 3 配置 安装Ubuntu虚拟机 熟悉终端操作 xff1a Ctrl 43 Alt 43 T 打开终端 Ctrl 43 Alt 43 X C V 代码 剪切复
  • librealsense2及pyrealsense2安装

    librealsense2及pyrealsense2安装 环境 xff1a 重新安装的Ubuntu16 04 xff0c 什么都没有 emmmmm 1 安装包 官方文档 xff1a https github com IntelRealSen
  • 【MATLAB】matlab多目标遗传算法的用法

    函数名 xff1a gamultiobj 详细的不多说 xff0c 帮助文档写的很清楚 xff0c 这里仅作为备忘简要写出常用用法 基于的算法是改良的NSGA II 用于求解多目标优化问题 object1 和object 2有一定的竞争关系
  • 【Linux】Linux下挂载新硬盘(图形化使用Ubuntu自带Disks)

    参考文章 Ubuntu 每日小贴士 在Ubuntu下用桌面图形界面挂载分区 Ubuntu 16 04 扩展 home大小并将其他盘挂载到 home的子目录下 Ubuntu环境下挂载新硬盘 使用工具 Ubuntu自带的图形化Disks工具 x
  • 安装和使用C++线性代数库eigen(Windows下minGW+VS code, VS2019配置方式)

    eigen是一个线性代数的第三方库 安装之后 xff0c 只要include相应头文件 xff0c 就可以方便地使用C 43 43 进行矩阵乘法 xff0c 矩阵求逆等操作 xff0c 像MATLAB一样 xff08 语法方面略微有区别 x

随机推荐

  • 标准立方米的单位换算

    换算mol与Nm3 1标准立方米 符号为Nm3 表示标况下 xff08 0 xff0c 101325Pa xff09 气体占据1立方米 由于标况下每mol气体的体积为22 4L xff0c 因此Nm3和摩尔是相对应的单位 相当于 1 N m
  • 【文献导读】XPBD: Position-Based Simulation of Compliant Constrained Dynamics

    作者 xff1a Miles Macklin amp Matthias Muller 单位 xff1a NVIDIA 时间 xff1a 2016 前言 本文要解决的主要问题是PBD中的刚度系数的迭代次数依赖问题 具体来说 xff0c 仿真效
  • 服务器http升级到https证书配置

    ios9规定网络请求必须使用https 小程序中要想打开指定的网页内容同时请求接口也只能使用https的接口 安卓P据说以后也要全部适配https 所有使用https请求是一种趋势 那就让我们先来了解一下什么是https xff1f htt
  • 【cmake】利用ExternalProject_Add解决第三方库target命名冲突问题

    参考 cmake菜谱第八章第一节 我们经常会遇到这种情况 xff1a project A 是最外层项目 project B 是A使用的外部库 project C 是A和B使用的外部库 extern B extern C src C src
  • 【Eigen笔记】3.1 稀疏矩阵操作

    3 1稀疏矩阵操作 参考 https eigen tuxfamily org dox devel group TutorialSparse html 稀疏矩阵就是绝大部分元素都为0的矩阵 稀疏矩阵与稠密矩阵不仅数据结构上不同 xff0c 可
  • 使用Houdini输出四面体网格并输出tetgen格式

    我们的目标是从houdini输出生成的四面体 xff0c 希望是tetgen格式的 众所周知 xff0c houdini是不能直接输出四面体的 有三方案去解决 xff1a 输出点云ply文件 xff0c 然后利用tetgen生成网格 输出H
  • Everything about PBD:关于PBD的一切!

    参考资料汇总 我的笔记 PBD初探 https blog csdn net weixin 43940314 article details 126065813 XPBD 文献笔记 https blog csdn net weixin 439
  • taichi windows编译 build from source

    先编译 env span class token punctuation span PY span class token operator 61 span span class token string 34 3 10 34 span e
  • Neohooken PBD 文献笔记

    Neohooken的本构模型为 定义能量密度为cosntraint的函数 能量密度的负梯度就是力 以上的能量密度分为CH与CD两项 CH就是净水应力造成的弹性力 CD就是应力偏量造成的弹性力 H stands for Hydrostatic
  • houdini vex 查找最近点的距离

    i span class token punctuation span span class token punctuation span 64 nears span class token operator 61 span span cl
  • OpenFOAM后处理,paraview创建动画视频的三种方式

    首先在 paraView中保存图片序列 点击file gt save Animation xff0c 可以保存为tif png jpg等格式的图片序列 可以规定保存的帧数 xff0c 默认是每个timestep一帧 注 xff1a 图片很多
  • 总结入门学习OpenFOAM的资料(网址、论坛、帖子、博客等)

    为了自己记录学习OpenFOAM的过程 xff0c 把收藏夹里面的网页整理一下 来源 首先 xff0c 大部分资料来源自 放羊君的博客 里面有很多入门建议 xff0c 网址等等 有入门者应该进行的步骤等等 正文 1 官方文档 xff08 O
  • ONOS简介

    一 与ODL区别 ONOS与OpenDayLight 两个控制器之间的较量 ODL 立场 xff1a 设备厂商 xff1a Cisco Citrix Systems Red Hat Brocade Ericsson ClearPath HP
  • centos7中mysql的安装配置

    1 在命令行输入以下命令下载 rpm的安装包 执行以下命令下载rpm的安装包 cd usr local src wget https dev mysql com get mysql80 community release el7 1 noa
  • onos1.10安装 Ubuntu18 java1.8

    版本1 10 tar包安装 xff0c java8 onos2 2以上需要jdk11 1 10是apache karaf 3 0 8 xff0c karaf直接进入ONOS xff0c 2 0以上版本启动均产生ERROR不知为何 xff08
  • prometheus数据持久化 docker部署

    https segmentfault com a 1190000015710814 prometheus修改配置不需要停掉 xff0c 只要修改yml之后用docker restart重启 prometheus存储方式 prometheus
  • 什么是私有云?私有云有哪些优势和劣势?

    私有云也是云计算的一种 xff0c 它具有云计算的通用优势 xff0c 主要包括超强的扩展性和自助服务 我们通常讲的云服务器和云主机 xff0c 一般指的公有云 xff0c 私有云相比公有云价格较高 xff0c 一般大中型企业的首选 xff
  • BigDecimal类型 比较大小的方法

    1 转成int BigDecimal b1 61 new BigDecimal 34 121454125453 145 34 if b1 intValue lt 0 System out println 34 金额为负数 xff01 34
  • Git报错解决:OpenSSL SSL_read: Connection was reset, errno 10054 错误解决

    首先 xff0c 造成这个错误很有可能是网络不稳定 xff0c 连接超时导致的 xff0c 如果再次尝试后依然报错 xff0c 可以执行下面的命令 打开Git命令页面 xff0c 执行git命令脚本 xff1a 修改设置 xff0c 解除s
  • java小知识:http请求传输文件流

    前文 xff1a 项目里要给第三方传输图片 xff0c 对方接口要求传文件流 xff0c 而不是常用的base64编码 xff0c 在此记录一下 xff5e 直接贴代码吧 xff1a import com alibaba fastjson