源起
最近微信小程序项目有个需求,用户可晒评论,支持上传本地图片。<br />使用核心API:
wx.chooseImage({count: 9, // 最多可以选择的图片张数,默认9sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认二者都有success: function (res) {// successconsole.log(res)}})
问题:上传本地图片,生成的图片链接是http://tmp/xxx.png格式的,在浏览器环境没法访问??故有了此文章!
详细解析
- 我们先来看下上传之后的回调链接: http://tmp/1guRQ8DxEN1r68cd28fba007f675b0e253b10365ffb9.png, 如下图: 咦,这里好像是接口返回了307哦,我们知道这是临时重定向!

那我们再看下Location字段返回的链接,会发现有个新的http请求:
至此,所以图片可以在微信开发者工具内访问=.=
- 临门一脚想了下能不能在普通浏览器查看此图片呢,既然想了那就试试吧:

咦,竟然不行,这里也看不到307重定向的请求,不过确实挺奇怪的http://tmp/xxx.png格式,不能访问才是对的吧。
- 我们再来看看微信开发者工具审查到的元素src是什么呢?
哦,确实是http://tmp/xxx.png格式哦,那为什么微信开发者工具内就可以使用呢?

- 既然在微信开发者工具内是有重定向的,可通过http://127.0.0.1:26897/tmp/1guRQ8DxEN1r68cd28fba007f675b0e253b10365ffb9.png,那我们试试在浏览器能否访问到该链接:

嗯,很棒棒哦,通过127.0.0.1:26897/tmp/xxx.png是可访问到该图片资源的。
HTTP状态码307
301
301: 永久重定向(Mova Permanently)。
- 当前的URL不再使用了,永远都重定向到新的URL;
- 搜索引擎以及其他爬虫识别到该状态码时,会更新旧 URL 的资源。
概念有点抽象,这里补充一个网上看到的🌰:访问该旧网址时,会自动重定向到新地址,下图为看到的Network情况:
302
302: 临时重定向
- 请求的资源无法从其标准地址访问, 却可通过另外的地址进行访问.
- GET请求不会发生变化, 其他方法有可能会变成GET请求(若client向server发送post请求, server返回url和302,若用户确认则发送post请求, 但实际很多浏览器直接变成了get请求)
概念有点抽象,这里补充一个网上看到的🌰:访问百度(http协议)时会重定向到百度(https), 下图为看到的Network情况:
But当你第二次访问的时候却返回了307(Internal Redirect),这是什么原因呢?
第二次请求的时候注意有个响应头: Non-Authoritative-Reason: HSTS(这是HTTP 的严格传输安全 (HSTS))。 看第二次请求的网络截图:
需要注意的是该响应头不是不是服务器端生成的,是CHROME创建的虚拟307响应 -> CHROME本地维护了一份HSTS站点列表知道该域名必须要HTTPS方式请求,于是截获做出307响应。
那么问题又来了,**浏览器是如何知道这个baidu.com这个域名需要使用严格传输安全 (HSTS) 呢?**<br />这是由于第一次重定向到(或者直接访问)https://www.baidu.com,响应头中有一个特殊的头: Strict-Transport-Security: max-age=172800 告诉浏览器在172800s内直接去使用https访问。不信你看看第一次请求的网络截图:<br />
307
307: 临时重定向(Internal Redirect)。
- 可确保请求方法和消息主体不发生变化
写在最后
本文主要是讲解了wx.chooseImage()上传本地图片,获取到的图片是[http://tmp/xxx.png](http://tmp/xxx.png)格式,是不能在微信开发者工具以外的浏览器进行访问的,But可通过[127.0.0.1:26897/tmp/xxx.png]()进行访问。
