php的文件上传

文件上传

php的文件上传放在了$_FILES数组里,单文件和多文件上传的区别在于$_FILES['userfile']['name']是否为数组,
不熟悉的可以读一下官方文档 单文件上传、 多文件上传

阿里云oss web直传实践

这里采用的是服务端签名后上传,没有使用回调。

阿里云提供了一个php和前端的示例,不过有点坑人,前端采用的是plupload插件,这种demo应该使用原生js更合适啊,毕竟上传的js插件各不相同。
使用jquery的ajax上传时,始终上传失败,于是用fiddler抓包demo,才知道了上传给oss的详细参数格式。

吐槽完毕,下面才是正式上菜。

  • 服务端生成policy,这里使用php
    下面的代码是从官方demo修改而来,可以通过Facade模式增加静态方法,方便调用。
    注意dir目录不能使用"/"开始。下面的签名算法来自阿里云的demo。
<?php
class OssPolicy
{private $oss_bucket ;private $oss_host;private $oss_appid;private $oss_appsecret;private $oss_expire ;//过期时间/*** OssPolicy constructor.* @param $bucket 阿里云oss的bucket* @param $host 对应bucket的host* @param $appId app_id* @param $appSecret app_secret* @param int $expire 过期时间*/public function __construct($bucket,$host,$appId,$appSecret,$expire=900) {$this->oss_expire = $expire;$this->oss_bucket = $bucket;$this->oss_host = $host;$this->oss_appid = $appId;$this->oss_appsecret = $appSecret;}private function gmt_iso8601($time) {$dtStr = date("c", $time); //格式为2016-12-27T09:10:11+08:00$mydatetime = new DateTime($dtStr);$expiration = $mydatetime->format(DateTime::ISO8601); //格式为2016-12-27T09:12:32+0800$pos = strpos($expiration, '+');$expiration = substr($expiration, 0, $pos);//格式为2016-12-27T09:12:32return $expiration."Z";}/*** @function getPolicy 获取policy* @author * @version 1.0* @date* @param $dir 上传目录* @param $maxSize 最大文件大小 单位M* @param int $expireTime 过期时间* @return $array policy*/public function getPolicy($dir,$maxSize=100,$expireTime=null){$expireTime = isset($expireTime) ? $expireTime : $this->oss_expire;$end = time() + $expireTime;$expiration = $this->gmt_iso8601($end);$conditions = [];$conditions[] = array(0=>'content-length-range', 1=>0, 2=>1024*1024*$maxSize); // 最大文件大小.用户可以自己设置 100M$start = array(0=>'starts-with', 1=>'$key', 2=>$dir); //表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录$conditions[] = $start;$arr = array('expiration'=>$expiration,'conditions'=>$conditions);$policy = json_encode($arr);$base64_policy = base64_encode($policy);$string_to_sign = $base64_policy;$signature = base64_encode(hash_hmac('sha1', $string_to_sign, $this->oss_appsecret, true));$response = array();$response['accessid'] = $this->oss_appid;$response['host'] = $this->oss_host;$response['policy'] = $base64_policy;$response['signature'] = $signature;$response['expire'] = $end;$response['bucket'] = $this->oss_bucket;$response['dir'] = $dir;  //这个参数是设置用户上传指定的前缀return $response;}
}
  • 前端
    过程 想后端请求policy,上传到阿里云,成功后通知后端
    不要问我代码为啥这么乱,我不生产代码,我只是代码的搬运工(从阿里云demo里搬出来,稍加修改)
    在用表单提交时,注册一下提交处理的函数,取出文件,然后OssUpload()即可。
oss_accessid = ''
oss_accessoss_key = ''
oss_host = ''
oss_policyBase64 = ''
oss_signature = ''
oss_callbackbody = ''
oss_filename = ''
oss_key = ''
oss_expire = 0
g_object_name = ''
g_object_name_type = 'local_name'
OSS_FILE_NAME_TYPE_LOCAL = "local_name"
OSS_FILE_NAME_TYPE_RANDOM = "random_name"oss_now = oss_timestamp = Date.parse(new Date()) / 1000;//向服务端请求policy
function send_request() {}
//生成签名
function get_oss_signature() {//可以判断当前oss_expire是否超过了当前时间,如果超过了当前时间,就重新取一下.3s 做为缓冲oss_now = oss_timestamp = Date.parse(new Date()) / 1000;if (oss_expire < oss_now + 3) {body = send_request()var obj = eval("(" + body + ")");oss_host = obj['host']oss_policyBase64 = obj['policy']oss_accessid = obj['accessid']oss_signature = obj['signature']oss_expire = parseInt(obj['expire'])oss_callbackbody = obj['callback']oss_key = obj['dir']}}//随机字符串
function random_string(len) {len = len || 32;var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';var maxPos = chars.length;var str = '';for (i = 0; i < len; i++) {str += chars.charAt(Math.floor(Math.random() * maxPos));}return str;
}
//获取文件名后缀
function get_suffix(filename) {pos = filename.lastIndexOf('.')suffix = ''if (pos != -1) {suffix = filename.substring(pos)}return suffix;
}
//根据文件名类型 临时文件还是原始文件名,返回文件名
function calculate_object_name(filename) {if (g_object_name_type == 'local_name') {g_object_name = oss_key + "${filename}"}else if (g_object_name_type == 'random_name') {suffix = get_suffix(filename)g_object_name = oss_key + random_string(10) + suffix}return ''
}//把policy填充到Formdata里
function set_upload_param(file) {get_oss_signature()if (file) {calculate_object_name(file.name);var res = {'key': g_object_name,'policy': oss_policyBase64,'OSSAccessKeyId': oss_accessid,'success_action_status': '200', //让服务端返回200,不然,默认会返回204
//                'callback': oss_callbackbody,'signature': oss_signature,};var form_data = new FormData();for ( var key in res ) {form_data.append(key, res[key]);}form_data.append("file",file);return res;}return false;}//上传到阿里云 callBack 是用来在上传成功后通知服务端
function OssUpload( file,fileNameType,callBack) {g_object_name_type = fileNameType;var form_data = set_upload_param(file.name);if(!form_data){alert("form_data error")return}var fileFullName = oss_host+form_data.get("key");$.ajax({url: oss_host,data: form_data,processData: false,cache: false,async: false,type:'POST',contentType: false,//这个就是了success: function (data, textStatus, request) {//textStatus === "success" 表示成功if(typeof callBack === "function") {callBack(fileFullName,form_data.get("policy"),textStatus);}},error : function(responseStr) {if(typeof callBack === "function") {callBack(fileFullName,form_data.get("policy"),responseStr.responseText);}}});
}

php阿里云oss文件上传相关推荐

  1. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    SpringBoot整合阿里云OSS文件上传.下载.查看.删除 该项目源码地址:https://github.com/ggb2312/springboot-integration-examples ( ...

  2. 解决阿里云oss文件上传部分MP4格式视频文件上传导致上传崩溃问题

    解决阿里云oss文件上传部分MP4格式视频文件上传导致上传崩溃问题 问题描述 java程序,使用阿里云oss文件上传服务,在测试时偶然发现,我用苹果手机开启高清进行摄像,将原图通过qq传到电脑上,在电 ...

  3. 阿里云oss文件上传工具类

    阿里云oss文件上传工具类 阿里云oss 阿里云oss 导入文件阿里云oss的maven依赖 <!-- 阿里云oss依赖 --><dependency><groupId& ...

  4. Java中阿里云OSS文件上传工具类

    阿里云OSS文件上传下载工具类 前言: 本质上就是获取配置文件信息,然后注入bean,调用sdk中提供的增删改方法: 为了避免同名文件会替换,用了hutool中唯一id生成+文件名做拼接 导入依赖:→ ...

  5. 阿里云OSS文件上传下载,拿来即用

    什么是OSS 我们可以理解为就是一个资源服务器,在这之前我也尝试过Nginx当静态资源服务器,但效果比较一般,为什么选择阿里云OSS,只是因为最近刚好公司用到了,所以就接入了,还有其他的比如七牛云,腾 ...

  6. Java学习踩坑:阿里云OSS文件上传前端通过路径获取报403错误

    错误还原:我在做OSS文件上传头像时,发现头像的图片文件可以上传成功,也可以返回文件的路径.但是前端在拿着后端返回的文件图片路径去访问这个图片时,Response中的错误码为403.找了一下网上的资料 ...

  7. 阿里云oss文件上传(简单上传、服务端签名后直传)

    前置: 自行开通阿里oss服务: https://www.aliyun.com/product/oss?spm=a2c4g.11174283.J_8058803260.125.d9387da2TjNf ...

  8. 阿里云OSS文件上传下载工具类

    引入依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss ...

  9. python实现阿里云OSS文件上传下载

    一 前言 最近使用到阿里云的产品OSS,用于临时存储线上抽取的数据,然后起本地化的流程去OSS拉回本地,进行自动化数据验证.OSS提供了web方式的管理控制台,命令行管理工具,提供了主流的SDK支持, ...

最新文章

  1. TemplatedParent 与 TemplateBinding
  2. 如何打造项目级硬核简历,成为一名合格的大厂工程师(必看)
  3. Storm-kafka源码分析之Config相关类
  4. CSS3的transform:将元素旋转,缩放,移动,倾斜
  5. 数字图像处理知识总结
  6. 一座在云端的工厂是什么样的?
  7. click Arguments
  8. Cortex M3/M4 学习摘要(一)
  9. Ansbile实战经验
  10. 不知道这些,你的世界杯就白看了!
  11. 终极算法 机器学习和人工智能如何重塑世界
  12. firefox浏览器书签意外丢失恢复经验
  13. 触发器:建立时间和保持时间
  14. ERROR2002(HY000):CantconnecttolocalMySQLserverthroughsocket/tmp/mys
  15. 房屋租赁系统 nodejs+vue微信小程序
  16. 在家用手机兼职稳定收入,三种实战方法
  17. 文章资源下载——百度云
  18. SAP MM批次管理(6)批次确定
  19. 手机视频怎么裁剪时长?教你三招快速搞定
  20. 超融合控制台linux重启完,深信服超融合架构平台-用户手册1.doc

热门文章

  1. 如何把很多照片拼成一张照片_一张25GB的照片,到底比普通照片强在哪儿?
  2. ORG.SPRINGFRAMEWORK.HTTP.CONVERTER.HTTPMESSAGENOTREADABLEEXCEPTION: COULD NOT READ JSON: UNRECOGNIZE
  3. 模型训练 准确率下降_手写批量线性回归算法:在Python3中梯度下降方法实现模型训练
  4. aboboo 上一句 快捷键_Word快捷键大全
  5. 华硕笔记本:Ubuntu 18.04安装Nvidia驱动
  6. vue如何封装请求接口方法
  7. 网络带宽和速度测试windows和linux iperf工具
  8. android arcgis 绘制圆_ArcGIS For Android 定位绘图工具 [中心点,误差圆]
  9. rpython求随机数代码4段5个字符_如何创建一个4位数的随机数并将其存储为变量...
  10. 【自动驾驶】23.相机成像究竟是成在像平面还是成在焦平面