当前位置: 首页 > 知识库问答 >
问题:

java - curl 请求后端图片接口时 后端报错(curl未选择接受图片),如何解决?

狄飞鹏
2023-11-20

问题来源

一个图床 其中处理图片的逻辑是本地读取图片并且以流的形式写入 response
在本地使用curl请求的时候(未配置curl参数) 的情况下请求的时候图片会报错
java.io.IOException: 你的主机中的软件中止了一个已建立的连接

尝试解决

在请求中判断header 如果是curl开头的就返回不支持json
但是这样会导致curl无法获取图片而且如果有其他类似curl的不接受文件流的也会报错

问题

想问如果实现对这类请求的过滤 让其返回一个不支持的json

其他信息

curl请求命令: curl http://127.0.0.1:8080/3862f6ea2fe849d8b922dc135556a4c4
controller层 response设置:

//photoEntity是图片文件response.reset();response.setCharacterEncoding(StandardCharsets.UTF_8.toString());response.setContentLengthLong(photoEntity.getSize());response.setContentType(photoEntity.getType());response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(uuid, StandardCharsets.UTF_8));

共有1个答案

孙书
2023-11-20

你描述得太混乱了,你的意思是通过curl请求接口时后端报错,所以你认为这是curl导致的,并且想要过滤并特殊处理这种请求吗?
这里面有几个问题:0.为什么报错?1.凡是curl就会导致这个报错吗?2.这个报错需要特殊处理吗?3.怎么特殊处理这种异常?
一个一个回答。
0.因为你提供的信息比较少,所以根据一般经验,我觉得这是因为你在通过curl调接口的时候没有指定响应文件怎么处理,所以curl可能直接读取了响应头之后就关闭了连接。这时候server还在尝试向curl客户端发送数据,但是对方已经关闭了,所以才会报错。
1.使用curl可以通过-o或--output指定文件保存路径。理论上curl是可以模拟任何http请求的,所以我不觉得这是curl的问题,如果curl有问题,那可能意味着别的客户端也调不了你的接口。
2.通过curl发起的请求和一般的http请求没任何区别,所以我觉得不需要区分出来。你也看到了异常类型是IOException IO异常,假设你用认为正常能用的client调接口,传输图片的过程中client的网断了,server也一样会报这个异常。这种异常本来就不是server端导致的,所以按理说也不该由server去处理。
3.不想在控制台打印堆栈信息,可以声明一个接口切面做异常处理,如果判断异常类型是IOException就不打印。

 类似资料:
  • 后端对于图片的处理大致有3种方式 1-存储到云服务器 2-存储到本地 3-存储到数据库 请问如何选择?

  • 这是我向Spotify发出身份验证请求的脚本,但它返回错误。我尝试更改内容类型,但这似乎并没有削减它。这是我的代码:

  • 我正在我的本地主机上构建Web应用程序。 前端是Reactjs框架,运行在LocalHost:3000中

  • 问题如题: 后端提供了一个接口地址是用来查询用户信息的,用管理员账号进入菜单则没有任何问题,但是换一个普通用户则请求都发不出去。 1.发送请求的截图 2.请求不通那个账号的请求截图 排查方式: 1.通过postman请求nginx,设置不同token,管理员token正常返回,普通用户token,则长时间等待后,返回nginx的404页面。 2.通过postman请求后端gateway网关应用,使

  • chooseImage 拍照或从手机相册中选图接口 使用方法 AlipayJSBridge.call('chooseImage', { sourceType: ['camera', 'album'], count: 6 }, function (result) { console.log(result); }); 代码演示 基本使用 <style>.img{ display:bloc

  • 问题内容: 我想创建一个下拉菜单,其中包含图像而不是文本作为选项。我在此处进行了一些Google搜索,然后在Stack Overflow上进行了搜索,通常给出的答案是使用jQuerycombobox。 在我看来,这种解决方案的问题在于您必须提供文本。看起来图像只是左侧文字的图标。如果我错了,请纠正我,但是此解决方案将无法解决我要尝试的工作- 完全用图像替换文本。 我正在尝试做的事情的一些背景知识-