美文网首页
1.关于IOS https图片上传失败的处理过程

1.关于IOS https图片上传失败的处理过程

作者: 一缕阳光直射你的心扉 | 来源:发表于2018-12-18 19:11 被阅读0次

    问题现象

    一个图片上传接口,处理逻辑如下

    • 1.文件上传到服务端(nginx+service架构)
    • 2.服务器端上传到腾讯云对象存储
    • 3.上传完成之后返回图片的url

    但是:http上传成功,https上传失败(调试的时候:代码没走到控制器代码就返回了)

    PostMan上传
    http://files.res.openread.cn/ios_https_bug_3.png
    Spring 控制器代码
    http://files.res.openread.cn/ios_https_bug_4.png

    思考

    • 1.安卓http能成功,说明代码逻辑没问题
    • 2.接口传入参数类型是MultipartFile,那么spring是如何包装这个参数给到接口的,这时候想到spring的 DispatcherServlet 的处理逻辑
    http://files.res.openread.cn/ios_https_bug_6.png

    源码调试

    > org.springframework.web.servlet.DispatcherServlet#doService 入口点
     > org.springframework.web.servlet.DispatcherServlet#doDispatch 服务分离处理
      > org.springframework.web.servlet.DispatcherServlet#checkMultipart 检查上传域(暂时忽视getHandler->getHandlerAdapter>handler的过程)
       > org.springframework.web.multipart.MultipartResolver#resolveMultipart
        > org.springframework.web.multipart.support.StandardMultipartHttpServletRequest
         > org.springframework.web.multipart.support.StandardMultipartHttpServletRequest#parseRequest
    
    貌似找到关键点,如下图
    http://files.res.openread.cn/ios_https_bug_7.png

    有点头绪了

    • 1.这里是通过header读取 CONTENT_DISPOSITION = "Content-Disposition";来组织MultipartFile对象
    • 2.那么是不是安卓的有这个hander,ios没有,但是走的都是nginx反向代理
    • 3.附上nginx的两套配置
    http://files.res.openread.cn/ios_https_bug_7.png http://files.res.openread.cn/ios_https_bug_7.png

    还是没戏,再想其它招数

    • 1.通过nc -l 10085 监听看看nginx到底向后端服务传送了什么玩意
    • 2.修改proxy_pass http://localhost:10085 向这里转发
    • 3.得到一下结果
    http://files.res.openread.cn/ios_https_bug_1.png http://files.res.openread.cn/ios_https_bug_2.png
    • 4.验证之前的调试结果,果然是header出的鬼,看来是tengine(nginx)做https反代的时候header的值没有尽数转给后端服务
    • 5.手动添加参数问题解决
    http://files.res.openread.cn/ios_https_bug_10.png

    总结

    • 1.nginx做https反代的时候注意header的值
    • 2.遇到问题,逐步分析,追根求源

    相关文章

      网友评论

          本文标题:1.关于IOS https图片上传失败的处理过程

          本文链接:https://www.haomeiwen.com/subject/uptrkqtx.html