好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

php直传oss php传参方式

很多站长朋友们都不太清楚php直传oss,今天小编就来给大家整理php直传oss,希望对各位有所帮助,具体内容如下:

本文目录一览: 1、 使用金山云的phpSDK报错了,有谁知道吗T.T 2、 Web直传阿里云OSS服务端临签名总结 2021-01-28 3、 OSSphp怎么上传文件到OSS 4、 阿里云oss php上传图片问题 上传前把图片重命名之后再上传到oss 怎么写代码呢 5、 php 怎么从oss上调用文件 6、 PHP 如何把 oss 上的图片同步到本地一份 使用金山云的phpSDK报错了,有谁知道吗T.T

目的

本教程的目录是通过三个例子介绍如何在Html表单提交直传OSS第一个例子:讲解签名在客户端(Javascript)完成,然后直接通过表单上传到OSS, 注意这个例子有安全风险,推荐使用第二个例子和第三个例子第二个例子:讲解签名在服务端(php)完成,然后直接通过表单上传到OSS第三个例子:讲解签名在服务端(php)完成, 并且服务端面设置了上传后回调。然后直接通过表单上传到OSS,OSS回调完应用服务器再返回给用户。

背景

每个用OSS的用户,都会用到上传。由于是网页上传,其中包括一些APP里面的html5页面,对上传的需求很强烈,很多人采用的做法是用户在浏览器/APP上传到应用服务器,然后应用服务器再把文件上传到OSS。

这种方法有三个缺点,

第一:上传慢,先上传到应用服务器,再上传到OSS,网络传送多了一倍,而且OSS是采用BGP带宽,能保证各地各运营商的速度。

第二:扩展性不好,如果后续用户多了,应用服务器会成为瓶颈。

第三:费用高,因为OSS上传流量是免费的。如果数据直传到OSS,不走应用服务器。那么将能省下几台应用服务器。

改进方案1:客户端用JS直接签名,然后上传到OSS示例

下面我将介绍用plupload ,在JS端签名然后直传数据到OSS的例子用户电脑浏览器测试样例:用手机测试该上传是否有效。二维码:可以用手机(微信,QQ,手机浏览器等)扫一扫试试(这个不是广告,只是上述网址的二维码。这为了让大家看一下这个实现能在手机端完美运行。)文件上传是上传到一个测试的公共 bucket , 会定时清理,所以不要传一些敏感及重要数据代码下载

oss-h5-upload-js-direct.tar.gz (381 K) 下载次数:1100原理

本例子的功能

1.采用plupload 直接提高表单数据(即PostObject)到OSS2.支持html5,flash,silverlight,html4 等协议上传3. 可以运行在PC浏览器,手机浏览器,微信等4.可以选择多文件上传

5.显示上传进度条

6.可以控制上传文件的大小

OSS的PostObject API细节可以参照(看不懂没有关系):

;PostObjectplupload

plupload是一款简单易用且功能强大, 拥有多种上传方式,(html5, flash, silverlight, html4)等方式,会智能检测当前环境选择最适合的方式,并且会优先采用Html5, 所以不用花心思去当前的浏览器要用何种方式上传,plupload会帮您考虑好。

关键代码

因为OSS原生支持POST协议。所以只要将plupload在发送POST请求时,带上OSS签名即可。

核心代码如下:

复制代码

var uploader = new plupload.Uploader({

runtimes : 'html5,flash,silverlight,html4',browse_button : 'selectfiles',

//runtimes : 'flash',

container: document.getElementById('container'),flash_swf_url : 'lib/plupload-2.1.2/js/Moxie.swf',silverlight_xap_url : 'lib/plupload-2.1.2/js/Moxie.xap',url : host,

multipart_params: {

'Filename': '${filename}',

'key' : '${filename}',

'policy': policyBase64,

'OSSAccessKeyId': accessid,

'success_action_status' : '200', //让服务端返回200,不然,默认会返回204'signature': signature,

},

....

}

签名signature主要是对policyText进行签名,最简单的例子如下:

复制代码

var policyText = {

"expiration": "2020-01-01T12:00:00.000Z", // 设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了"conditions": [

["content-length-range", 0, 1048576000] // 设置上传文件的大小限制,如果超过了这个大小,文件上传到OSS会报错的]

}

Cors

注意:如果一定要保证bucket属性Cors设置支持POST方法。因为这个HTML直接上传到OSS,会产生跨域请求。必须在bucket属性里面设置允许跨域设置如下图:

进阶篇-应用服务器php返回签名

背景

上述例子有一个很严重的安全隐患。就是OSS AccessId/AccessKey暴露在前端页面。可以随意拿到accessid/accesskey. 这是非常不安全的做法将此例子进化,签名及上传policy从后端php代码取。

请求逻辑是:

1.客户端要上传图片时,到应用服务器取上传的policy及签名2.客户端拿到签名直接上传到OSS

示例

直接用网页访问:用手机测试该上传是否有效。二维码:可以用手机(微信,QQ,手机浏览器等)扫一扫试试(这个不是广告,只是上述网址的二维码。这为了让大家看一下这个实现能在手机端完美运行。)文件上传是上传到一个测试的公共 bucket , 会定时清理,所以不要传一些敏感及重要数据代码下载

oss-h5-upload-js-php.tar.gz (382 K) 下载次数:600原理

设置plupload 上传参数如下:

复制代码

multipart_params: {

'key' : key + '${filename}'//后面会介绍到,key是应用服务器返回的,指定用户必须以这个前缀上传文件。

'policy': policyBase64,

'OSSAccessKeyId': accessid,

'success_action_status' : '200', //让服务端返回200,不然,默认会返回204'signature': signature,

},

js最主要是从后端取到policyBase64, 及accessid,及signature这三个变量。 往后端取这三个变量核心代码如下:

复制代码

phpUrl = './php/get.php'

xmlhttp.open( "GET", phpUrl, false );

xmlhttp.send( null );

var obj = eval ("(" + xmlhttp.responseText+ ")");host = obj['host']

policyBase64 = obj['policy']

accessid = obj['accessid']

signature = obj['signature']

expire = parseInt(obj['expire'])

key = obj['dir']

现在咱们来一起解析一下xmlhttp.responseText(这个是我设计的范围,并不一定要求是以下的格式,但是必须有signature, accessid, policy这三个值)复制代码

{"accessid":"6MKOqxGiGU4AUk44",

"host":"","policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19","signature":"I2u57FWjTKqX\/AE6doIdyff151E=","expire":1446726203,"dir":"user-dir/"}

第一个变量accessid: 指的用户请求的accessid,注意单知道accessid, 对数据不会有影响。

第二个变量host: 指的是用户要往哪个域名发往上传请求。

第三个变量policy:指的是用户表单上传的策略policy, 是经过base64编码过的字符串第四个变更signature:是对上述第三个变量policy签名后的字符串第五个变量expire:指的是当前上传策略失效时间,这个变量,并不是用来发送到OSS,因为这个已经指定在policy里面,这个变量的含义,后面讲。

现在咱们分析一下policy的内容,将其解码后的内容是:

复制代码

{"expiration":"2015-11-05T20:23:23Z",

"conditions":[["content-length-range",0,1048576000],["starts-with","$key","user-dir\/"]]

这里有一个关键的地方,PolicyText指定了该Policy 上传失效的最终时间。即在这个失效时间之前,都可以利用这个policy上传文件,所以没有必要每次上传,都去后端取签名。减少后端的压力。在这里我的设计是:初始化上传时,每上传一个文件后,取一次签名。然后再上传时,将当前时间跟签名时间对比,看是签名时间是否失效了。如果失效了,就重新取一次签名,如果没有失效就不取。这里就用到了第五个变量expire核心代码如下:

复制代码

now = timestamp = Date.parse(new Date()) / 1000;[color=#000000]//可以判断当前expire是否超过了当前时间,如果超过了当前时间,就重新取一下.3s 做为缓冲[/color]

if (expire < now + 3)

{

.....

phpUrl = './php/get.php'

xmlhttp.open( "GET", phpUrl, false );

xmlhttp.send( null );

......

}

return .

再看一下上面policy 的内容比上面增加了starts-with, 这个指定此次上传的文件名,必须是user-dir开头(这个字符串,用户可以自己指定)为什么要增加这个的含义是:很多场景,一个应用一个bucket,不同用户的数据,为了防止数字覆盖,每个人上传到OSS,可以有特定的前缀。那么问题来了,那用户获取到这个policy后,是不是在失效期内,都能修改上传前缀,从而上传到别人的目录呢?所以,应用服务器可以在上传时就指定让用户传文件时,必须是某个前缀。如果用户拿到了policy他也没有办法上传别人的前缀上。保证了数据的安全性。

终级篇--应用服务器php返回签名及采用上传回调背景

当采用第二个方案后,问题来了,用户来了数据,并且上传数据后,很多场景下,应用服务器都要知道用户上传了哪些文件,文件名字,甚至如果是图片的话,图片的大小等。为此OSS开发了上传回调功能。

千万注意

上传回调功能目前只开放了两个域, 杭州跟北京(即通过oss.aliyuncs测试数据, oss-cn-hangzhou.aliyuncs测试数据, oss-cn-beijing.aliyuncs测试数据 这三个域名能调用上传回调)。 只有上传域名是这两个域,才能调用上传回调。

增加了请求回调后,用户的请求逻辑如下:

第一:用户先向应用服务器取到上传policy和回调设置第二:应用服务器返回上传policy和回调

第二:用户直接向OSS发送文件上传请求

第三:等文件数据上传完,OSS给用户Response前,OSS会根据用户的回调设置,请求用户的服务器。

第四:如果应用服务器返回成功,那么就返回用户成功,如果应用服务器返回失败,那么OSS也返回给用户失败。这样确保了用户上传成功的照片,应用服务器都已经收到通知了。

第五:应用服务器给OSS返回。

第六:OSS将应用服务器返回的内容返回给OSS。

上传回调功能目前只开放了两个域, 杭州跟北京(即通过oss.aliyuncs测试数据, oss-cn-hangzhou.aliyuncs测试数据, oss-cn-beijing.aliyuncs测试数据 这三个域名能调用上传回调)。 只有上传域名是这两个域,才能调用上传回调。

示例

示例:用手机测试该上传是否有效。二维码:可以用手机(微信,QQ,手机浏览器等)扫一扫试试(这个不是广告,只是上述网址的二维码。这为了让大家看一下这个实现能在手机端完美运行。)文件上传是上传到一个测试的公共 bucket , 会定时清理,所以不要传一些敏感及重要数据代码要添加的东西

复制代码

new_multipart_params = {

'key' : key + '${filename}',

'policy': policyBase64,

'OSSAccessKeyId': accessid,

'success_action_status' : '200', //让服务端返回200,不然,默认会返回204'callback': callbackbody,

'signature': signature,

};

上述的callbackbody 是php服务端返回的。在本例中,从后端php取到的内容如下:

复制代码

{"accessid":"6MKOqxGiGU4AUk44",

"host":"http:\/\/post-test.oss-cn-hangzhou.aliyuncs测试数据","policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDo1MjoyOVoiLCJjdb25kaXRpb25zIjpbWyJjdb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19","signature":"VsxOcOudxDbtNSvz93CLaXPz+4s=","expire":1446727949,

"callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jdb206MjM0NTAiLCJjYWxsYmFja0hvc3QiOiJvc3MtZGVtby5hbGl5dW5jcy5jdb20iLCJjYWxsYmFja0JvZHkiOiJmaWxlbmFtZT0ke29iamVjdH0mc2l6ZT0ke3NpemV9Jm1pbWVUeXBlPSR7bWltZVR5cGV9JmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9JndpZHRoPSR7aW1hZ2VJdbmZvLndpZHRofSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==","dir":"user-dir\/"}

上面提到callbackbody, 就是上述返回结果里面的callback内容,经过base64编码后的。

解码后的内容如下:

复制代码

{"callbackUrl":"","callbackHost":"oss-demo.aliyuncs测试数据",

"callbackBody":"filename=${object}size=${size}mimeType=${mimeType}height=${imageInfo.height}width=${imageInfo.width}","callbackBodyType":"application/x-www-form-urlencoded"}

内容的解析如下:

CallbackUrl: 指的是oss往这个机器发送的url请求。

callbackHost:指的的oss发送这个请求时,请求头部所带的Host头callbackBody: OSS请求时,发送给应用服务器的内容,可以包括文件的名字,大小,类型,如果是图片可以是图片的高度,宽度callbackBodyType: 请求发送的Content-Type

代码下载

oss-h5-upload-js-php-callback.tar.gz (412 K) 下载次数:522应用服务器

在上述有一个很重要的地方就是第四步和第五步,OSS与应用服务器交互的时候,问题1:如果我是开发者,那么我要怎么样确认请求是从OSS发送过来的呢?

答案:OSS发送请求时,会跟应用服务器构造签名。两者通过签名保证。

问题2: 这个签名是怎么做的?或者有示例代码吗?

答案:有的。我上面的例子里面是Callback应用服务器的例子是: (目前只支持linux)上面运行的代码是:

callback_app_server.py.zip (2 K) 下载次数:365运行方案,在linux下面直接执行里面的文件:

python callback_app_server.py

即可,程序自实现了一个简单的http server.

是不是很简单!!!!

总结

第一个例子:讲解如何在JS直接签名,直接表单上传到OSS oss-h5-upload-js-direct.tar.gz (381 K)

第二个例子:讲解如何在从后端PHP获取签名,然后直接表单上传到OSS oss-h5-upload-js-php.tar.gz (382 K)

第三个例子:讲解如何在从后端PHP获取签名及上传后回调。然后直接表单上传到OSS,OSS回调完应用服务器再返回给用户。 oss-h5-upload-js-php-callback.tar.gz (412 K)

Web直传阿里云OSS服务端临签名总结 2021-01-28

最近公司有新的需求,需要将文件上传到阿里云OSS,目前项目中的文件主要是存储到自己的服务器,这样很容易受服务器带宽、硬件的影响,加上服务器配置不高,应用服务很容易垮掉。之前也用过OSS,但是上传文件都是比较小的10MB以内的文件,采用的是生成数据流的方式。这种情况已经无法满足现在的应用场景,就又熟悉了一下SDK文档,主要的实现方式有:

1、 上传慢。先上传到应用服务器,再上传到OSS,网络传送多了一倍。如果数据直传到OSS,不走应用服务器,速度将大大提升,而且OSS是采用BGP带宽,能保证各地各运营商的速度。

2、 扩展性不好。如果后续用户多了,应用服务器会成为瓶颈。

3、 费用高。由于OSS上传流量是免费的。如果数据直传到OSS,不走应用服务器,那么将能省下几台应用服务器。

采用JavaScript客户端直接签名(参见 JavaScript客户端签名直传 )时,AccessKey ID和AcessKey Secret会暴露在前端页面,因此存在严重的安全隐患。因此,OSS提供了服务端签名后直传的方案。

流程如下图所示:

本示例中,Web端向服务端请求签名,然后直接上传,不会对服务端产生压力,而且安全可靠。但本示例中的服务端无法实时了解用户上传了多少文件,上传了什么文件。如果想实时了解用户上传了什么文件,可以采用 服务端签名直传并设置上传回调 。

OSS 可以通过阿里云 STS (Security Token Service) 进行临时授权访问。阿里云 STS 是为云计算用户提供临时访问令牌的Web服务。通过 STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。

STS 安全令牌、角色管理和使用相关内容详情,请参考 RAM 角色管理 。调用 STS 服务接口 AssumeRole 来获取有效访问凭证即可。

前端调用,请根据自身情况进行调用,下面是vue的示例

我们在项目中最终采用的是STS临时授权方案。

STS的优势如下:

关于STS的介绍请查阅阿里云官方文档:

在这边不得不吐槽一下OSS的API,是真的很烂,基本找不到好的方法,都是基于百度才做出来的,当然,我使用的方法估计还有一些坑,只是能实现了我的功能。

STS临时授权访问OSS

vue直传OSS

el-upload组件结合上传阿里云OSS实现更优交互

Web直传OSS

OSS文件上传(页面直传)

请问STS和签名带Policy的差别

STS临时授权访问OSS

vue+element+sts临时授权上传大文件到阿里云OSS时踩过的坑。

Vue上传阿里云OSS(STS方式)

OSSphp怎么上传文件到OSS

很简单,你先在项目建设一个临时放缓存文件的目录,然后将文件放在这个临时缓存目录,再将目录里的文件上传到oss上,然后删掉缓存目录里的临时文件。。。。刚才我同事说的思维是这样,具体代码待会儿用到了再来完善回答

阿里云oss php上传图片问题 上传前把图片重命名之后再上传到oss 怎么写代码呢

他这里有一个上传示例的

<?php?

?

/**?

*?加载sdk包以及错误代码包?

*/?

require_once?'oss_php_sdk/sdk.class.php';?

$oss_sdk_service?=?new?ALIOSS();?

$bucket?=?'你的bucket名字';?

?

if?((($_FILES["file"]["type"]?==?"image/gif")?

||?($_FILES["file"]["type"]?==?"image/jpeg")?

||?($_FILES["file"]["type"]?==?"image/pjpeg"))?

?($_FILES["file"]["size"]?<?2000000))?

{?

????if?($_FILES["file"]["error"]?>?0)?

????{?

????????echo?"Return?Code:?"?.?$_FILES["file"]["error"]?.?"<br?/>";?

????}?

????else?

????{?

????????echo?"Upload:?"?.?$_FILES["file"]["name"]?.?"<br?/>";?

????????echo?"Type:?"?.?$_FILES["file"]["type"]?.?"<br?/>";?

????????echo?"Size:?"?.?($_FILES["file"]["size"]?/?1024)?.?"?KB<br?/>";?

????????echo?"Temp?file:?"?.?$_FILES["file"]["tmp_name"]?.?"<br?/>";?

?

????????$content?=?'';?

????????$length?=?0;?

????????$fp?=?fopen($_FILES["file"]["tmp_name"],'r');?

????????if($fp)?

????????{?

????????????$f?=?fstat($fp);?

????????????$length?=?$f['size'];?

????????????while(!feof($fp))?

????????????{?

????????????????$content?.=?fgets($fp,8192);?

????????????}?

????????}?

????????$upload_file_options?=?array('content'?=>?$content,?'length'?=>?$length);?

????????$upload_file_by_content?=?$oss_sdk_service->upload_file_by_content($bucket,?$_FILES["file"]["name"],?$upload_file_options);?//$_FILES["file"]["name"]这个就是文件名,你可以自己定义的。

????????$img_url?=?""?.?$bucket?.?"/"?.?$_FILES["file"]["name"];?

????????echo?"Upload?successfully!?The?OSS?URL?of?this?file:?"?.?$img_url?.?"<br?/>";?

????????echo?"If?the?bucket?is?public-read,?the?uploaded?image?can?be?shown?as:"?.?"<br?/>";?

????echo?"<img?src=$img_url?/>";?

????}?

}?

else?

{?

????echo?"Invalid?file";?

}

关于文件名我已经给你注释在代码中了,你试试看

php 怎么从oss上调用文件

直接把oss图片地址放到img标签的src里就可以了.如果设置的对应的域名 就可以直接替换成这个域名.

PHP 如何把 oss 上的图片同步到本地一份

oss有接口文档以及sdk,可以创建授权账户,然后使用sdk连接oss,获取对象列表,然后下载

具体看你用的哪一家的

阿里云OSS文档

关于php直传oss的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于php直传oss php传参方式的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did209044
更新时间:2023-05-03   阅读:9次

上一篇: 织梦dedephp 织梦dedecms蓝色励志文章图集门户模板

下一篇:wget下载php wget下载的文件保存在哪

相关资讯

最新资料更新

  • 1.php的token请求 php简单的token验证
  • 2.商品展示模块php 商品展示模块的设计要点
  • 3.phpjson提交 phppost提交
  • 4.php上传源码教程 php上传下载源码
  • 5.php英国时区代码 英国时区缩写
  • 6.php仿应用商店 php android 应用
  • 7.php生成缓存图片 php缓存机制有哪些
  • 8.郑州php业余培训 郑州php业余培训机构
  • 9.php提示重复提交 php api防止重复提交
  • 10.php后端需要css吗 php后端教程
  • 11.php上传图片木马 php图片上传代码
  • 12.imagephp缩放 缩放图像可以改变图像的分辨率吗
  • 13.php中文注释乱码 php注释语句
  • 14.析构函数php 析构函数不能指定返回类型
  • 15.php双色球案例 双色球php复式逻辑
  • 16.php类方法 php类方法访问变量
  • 17.php如何生成动态页面 php动态网页制作教程
  • 18.php批量取中间 php批量删除数据
  • 19.php怎么开发xml php处理xml数据
  • 20.仿win桌面php源码 仿windows桌面

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]