ucloud 对象存储在上传单文件,api 和 sdk 给我造成了一点困扰,api 说了 HTTP 方法是 put,但 phpsdk 用的 postfields,这不是 post 吗?参考网页和腾讯的 sdk 都是乖乖用的 UPLOAD READATA。
对于我来说奇怪的地方在于,ucloud 用的 file_get_contents,而后面用的 fopen,如果把 fopen 改成 file_get_contents (相当于 fopen,fread,fclose 的集合)就会报错,说必须用 file_handle。
腾讯的也可以按照 ucloud 的做法用,网易会报错认证失败。
之所以这样是因为,put 和 post 最大区别在于 post 可以提交多个字段的内容,多个字段内容用&或者随机字符边界分割。
如果提交的只有一个内容,格式应该是没区别的,所以在对象存储上传单文件的时候用 postfields,服务器收到的内容是一样的,之所以 ucloud 和腾讯可以通过,应该是忽略了收到方法为 post,而是直接固定用了 put,而网易按收到的方法校验,file_get_contents 显然比 fopen 这个方法好用啊,fopen 还要接着写个 fclose,或许 ucloud 在这里偷了个懒。
curl 并不是靠传来的方法作为使用方法,而是用实际判断真实方法,用 upload 就一定是 put,用 postfields 就会是 post。
我奇怪的就是为什么 READATA 一定要是个资源句柄,而不是文件的真实内容呢?
c#用的也是 openread 方法,c#不太懂,我看了 curl 的源码也看不懂,不知道 READATA 和 postfields 最后在哪产生了分别。
对于我来说奇怪的地方在于,ucloud 用的 file_get_contents,而后面用的 fopen,如果把 fopen 改成 file_get_contents (相当于 fopen,fread,fclose 的集合)就会报错,说必须用 file_handle。
腾讯的也可以按照 ucloud 的做法用,网易会报错认证失败。
之所以这样是因为,put 和 post 最大区别在于 post 可以提交多个字段的内容,多个字段内容用&或者随机字符边界分割。
如果提交的只有一个内容,格式应该是没区别的,所以在对象存储上传单文件的时候用 postfields,服务器收到的内容是一样的,之所以 ucloud 和腾讯可以通过,应该是忽略了收到方法为 post,而是直接固定用了 put,而网易按收到的方法校验,file_get_contents 显然比 fopen 这个方法好用啊,fopen 还要接着写个 fclose,或许 ucloud 在这里偷了个懒。
curl 并不是靠传来的方法作为使用方法,而是用实际判断真实方法,用 upload 就一定是 put,用 postfields 就会是 post。
我奇怪的就是为什么 READATA 一定要是个资源句柄,而不是文件的真实内容呢?
c#用的也是 openread 方法,c#不太懂,我看了 curl 的源码也看不懂,不知道 READATA 和 postfields 最后在哪产生了分别。