拷贝粘贴踩坑之Content-length

2023-11-12

最近在开发时遇到需要上传文件的功能,我自然而然地上网找了段实现上传功能的代码。我的程序有两个地方需要上传文件,这段代码在一处能用,另一处就报错了。代码如下:

File file = new File(  "文件路径" );
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        builder.setBoundary("---------------------------7e5db2ac0ab0");
        builder.addBinaryBody("abc",new FileInputStream(file) , ContentType.APPLICATION_OCTET_STREAM, file.getName());//
        httpPost.setEntity(builder.build());
        HttpResponse response = client.execute(httpPost);

这段代码请留意 builder.addBinaryBody 的第二个参数,它的类型是流。这段代码在另一处运行时,会得到如下返回:

411 Length Required

Length Required

A request of the requested method POST requires a valid Content-length.

意思是说,请求头需要有Content-length字段。同一段代码,一处正常一处异常,这就让人很恼火了,而且排查也不太容易。这问题耗了我快两天时间,最后我从底层抛异常的源码慢慢地排查才发现,builder.addBinaryBody 的第二个参数如果是File类型,在请求报文的头部会自动生成Content-length字段并自动计算和赋值!
后来代码改为:

builder.addBinaryBody("filename",file , ContentType.APPLICATION_OCTET_STREAM, file.getName());
//第二个参数直接传入File类型对象。

后来我对自己遇到这问题后整个解决过程作了回顾。一开始觉得很莫名奇妙,因为同样的代码一处成功另一处失败,但是当时不管那么多了,就根据响应信息,人为地在请求报文头部添加Content-length这段。但随后直接报异常,大意是不能重复加这个字段。这时顿感万分尴尬,不知如何是好。更要命的是,在网上也找不到解决我这问题的文章。最后,在无何奈何之下,重新整理心情,从源代码入手,慢慢顺藤摸瓜地一层一层往上查源码,最后才发现原来有另一个接口可用。

最后总结。在开发过程中,我们在网上摘取代码无可厚非,然而这些代码不一定完全适用。我们必须有足够的心理准备。一旦运行结果不是我们预期的时候,翻查源码是可选项之一。当运行结果不符合预期时,我们必须冷静分析,一个是根据错误提示排查;另一个大不了翻查源码,只要有信心和耐心一定能够查出原因。

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

拷贝粘贴踩坑之Content-length 的相关文章

  • 搭建http请求方式的git

    第一步 安装msysGit 百度下载 注意 安装时 要清除CopSSH在path中的配置 第二步 安装Apache服务器 注意 下载Window版的XAMPP 里面保括了Apache服务器 第三步 配置Apache服务器 注意端口冲突 和密
  • 记elementUI的popover出现在页面左上角

    找了好久找不到解决办法 给自己记一下 目标 出现在目标元素左侧 出现情况 出现在了页面左上方 产生原因 导入文件 文件导入后跟后端要上传失败的条数 封装了一个组件 只要有数字大于0 elpopover立马出现 但是向后端发起请求在导入成功十
  • Redis建集群时出现[ERR] Sorry, can‘t connect to node的错误

    Redis建集群时出现 ERR Sorry can t connect to node的错误 原因是由于Redis设置密码 无法连接 但由于Redis不设置密码容易被入侵 因此需要找到ruby中的配置文件加入密码的配置 先要安装ruby和r
  • mysql使用sql备份单个表

    1 复制表结构及数据 1 1第一种方式 create table A backup select from A 基于GTID复制会报错 1786 Statement violates GTID consistency CREATE TABL
  • androidx.lifecycle 中 ViewModelProviders 源码学习

    如果在学习 LiveData 其中需要ViewModelProviders 会出现爆红 找不到该类的方法 那是没有导入相关库 如下 implementation androidx lifecycle lifecycle viewmodel
  • 停止Tomcat报错:java.net.ConnectException: 拒绝连接 (Connection refused)

    问题描述 今天在部署项目时 发现停止tomcat的过程中抛出了异常 java net ConnectException 拒绝连接 Connection refused 几次尝试 项目中写的有定时任务 所以猜测是定时任务导致项目停止失败 解决
  • java操作excel表格详解

    在日常工作中 对Excel工作表格的操作处理可是多的数不清楚 下面是java语言对其的操作 有需要的小伙伴可以参考下 使用场景 1 将用户信息导出为excel表格 导出数据 2 将Excel表中的信息录入到网站数据库 习题上传 大大减轻网站
  • 【爬虫+可视化】Python爬取疫情数据,并做可视化展示

    知识点 爬虫基本流程 json requests 爬虫当中 发送网络请求 pandas 表格处理 保存数据 pyecharts 可视化 开发环境 python 3 8 比较稳定版本 解释器发行版 anaconda jupyter noteb
  • MPI 和OPENMP 混合编程 实现矩阵LU分解

    LU分解 将系数矩阵A转变成等价两个矩阵L和U的乘积 其中L和U分别是下三角和上三角矩阵 当A的所有顺序主子式都不为0时 矩阵A可以分解为A LU 且分解唯一 其中L是单位下三角矩阵 U是上三角矩阵 方法 使用openMP和MPI混合编程现

随机推荐

  • Jeesite开发平台限制用户多点登录

    Jeesite开发平台限制用户多点登录 授权查询回调函数 进行鉴权但缓存中无用户的授权信息时调用 Override protected AuthorizationInfo doGetAuthorizationInfo PrincipalCo
  • web前端性能优化

    1 图片处理 图片压缩 使用图片图片压缩 优化工具TinyPNG TinyJPG压缩图片 或者使用其Gulp 组件gulp tinypng结合到自动化构件流程中 图片格式转为base64 使用webpack的url loader 自动根据文
  • MyBatis 的架构

    MyBatis 的架构 MyBatis 是一个基于 Java 的持久层框架 可以将 SQL 语句和 Java 代码进行分离 通过 XML 或注解的方式配置 SQL 语句并执行 从而实现数据访问的功能 MyBatis 的架构包括以下几个部分
  • Mysql 实战之——读写分离方案

    Linux环境 Centos 6 8 64 bit Mysql 版本 5 1 7 一 准备工作 部署Mysql主从复制 二 使用Amoeba数据库代理来实现读写分离 Amoeba作为数据库代理 以中间件的形式存在 拓扑图如下所示 Amoeb
  • cad多个窗口并排显示_CAD的入门小技巧

    在CAD中可以绘制二维 三维图形 也可以对图纸中的图形进行标注和进行渲染 比较广泛的应用于建筑 机械 环境工程 电子 设计等一些行业 启动与退出启动 1 在桌面双击CAD图标2 开始 程序 Autodesk Autodesk CAD CAD
  • got an unexpected keyword argument 'xxx'

    这几天在捣鼓pyecharts的地图功能
  • Windows Mobile 设备中心 for vista 一览

    2007年06月21日 14 30 00 Microsoft Windows Mobile 设备中心 6 1 在6月6日发布了最新版 今天为了能在Vista开发PPC 或Wince设备 程序 下载安装了该程序 启动后界面确实很炫 和媒体中心
  • 【论文合集】2022年11月医学影像期刊论文合集

    本月IEEE Transactions on Medical Imaging 1区 top if 11 037 共41篇 Medical Image Analysis 1区 top if 13 828 共47篇 标题高频词汇 segment
  • Non-terminating decimal expansion; no exact representable decimal result.

    日志信息 问题分析 由于 BigDecimal 是不可变的 任意精度的有符号十进制数 所以可以做精确计算 但在除法中 准确的商可能是一个无限长的十进制扩展 例如 1 除以 3 所得的商 若我们在做除法时 没有指定舍入模式 无法表示为准确的结
  • C# 串口通信 stm32 电机

    前几天已经完成了stm32通过PWM对电机的控制 这几天趁上班之余 也完成了c 通过串口通信控制电机的运行 界面如下 好久没写文章了 发现非常不擅长分享和表达 第一反应是演示出来 可惜这里不能有动画 功能不强大啊 哪天有空了 把上位机代码和
  • json库 nlohmann/json 的基本使用

    C 的json库有很多 但nlohmann 链接 https github com nlohmann json 大概是目前使用最方便的跨平台json库了 其可以让用户以modern C 的方式解析和构建json 性能比rapidjson库略
  • 安卓c语言获取context,Android中Context详解 ---- 你所不知道的Context

    二 什么时候创建Context实例 熟悉了Context的继承关系后 我们接下来分析应用程序在什么情况需要创建Context对象的 应用程序创建Context实例的 情况有如下几种情况 1 创建Application 对象时 而且整个App
  • 一点就通——ChatGPT翻译润色的最新简明使用方案

    prompt使用推荐 1 翻译prompt 翻译主要有两种 第一种是我们的老朋友厦门大学潘王雨昂 个人主页 pwya github io 所编写使用的prompt 第二种是我自己改造的 1 我希望你能担任英语翻译 拼写校对和修辞改进的角色
  • JAVA——JSch

    第 1 章 JSch简介 1 1 简述 1 jsch是ssh2的一个纯Java实现 它允许你连接到一个sshd服务器 使用端口转发 X11转发 文件传输等 2 SSH 是较可靠 专为远程登录会话和其他网络服务提供安全性的协议 3 ftp协议
  • 金融量化— 动量策略(Momentum Strategy)

    什么是动量效应和动量交易策略 动量效应是指过去收益较高的资产 在未来一段时间内仍获得较高的收益 过去收益较低的资产在未来仍获得较低的收益 对于动量效应现象的解释 传统金融学认为 动量效应的存在并不是市场无效的证据 并试图从理性风险补偿这一角
  • Vue中的Diff算法

    Vue中的Diff算法 本篇文章主要介绍Diff算法的思想和Vue中对Diff算法的基本实现 1 为什么要用Diff算法 由于在浏览器中操作DOM的代价是非常 昂贵 的 所以才在Vue引入了Virtual DOM Virtual DOM是对
  • Java Response实现文件下载

    Servlet代码 public class ResponseFileServlet extends HttpServlet public void doGet HttpServletRequest request HttpServletR
  • HTML---表格合并(详解)

    例子详解 关键字解释 border 1 表格标签默认是无边框的 所以这里加上border 1 是为了更好的进行样式展示 colspan 2 表示的是进行单元格列合并 在该行中 先是th表头占据了一个单元格 之后遇到th 用colspan 2
  • JAVA错误: 在类中找不到主方法, 请将主方法定义为:public static void main(String[] args)

    一个类只有包含了入口才能运行 这个入口告诉了系统从哪开始运行程序 入口的格式固定 例如 class test public static void main String args 入口代码
  • 拷贝粘贴踩坑之Content-length

    最近在开发时遇到需要上传文件的功能 我自然而然地上网找了段实现上传功能的代码 我的程序有两个地方需要上传文件 这段代码在一处能用 另一处就报错了 代码如下 File file new File 文件路径 MultipartEntityBui