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:32
return $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. 构建基于阿里云OSS文件上传服务

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50710132 <构建基于阿里云OSS文件上传服务> <构建基于OS ...

  2. 记一次阿里云oss文件上传服务假死

    引言 记得以前刚开始学习web项目的时候,经常涉及到需要上传图片啥的,那时候都是把图片上传到当前项目文件夹下面,每次项目一重启图片就丢了.虽然可以通过修改/tomcat/conf/server.xml ...

  3. PHP实现阿里云OSS文件上传(支持批量)

    上传文件至阿里云OSS,整体逻辑是,文件先临时上传到本地,然后在上传到OSS,最后删除本地的临时文件(也可以不删,具体看自己的业务需求),具体实现流程如下:   1.下载阿里云OSS对象上传SDK(P ...

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

    1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...

  5. 阿里云OSS文件上传封装

    1.先用composer安装阿里云OSS的PHPSDK 2.配置文件里定义阿里云OSS的秘钥 3.在index控制器里的代码封装 <?php namespace app\index\contro ...

  6. 记录-阿里云Oss文件上传

    public class OssUtil { /** * 上传图片 * @param file * @param request * @return */ public static Map<S ...

  7. Thinkphp整合阿里云OSS图片上传实例

    Thinkphp3.2整合阿里云OSS图片上传实例,图片上传至OSS可减少服务器压力,节省宽带,安全又稳定,阿里云OSS对于做负载均衡非常方便,不用传到各个服务器了 首先引入阿里云OSS类库 < ...

  8. SpringBoot完美配置阿里云的文件上传

    新建一个config类 AliyunOSS.java @Configuration @Data public class AliyunOSS { private OSSClient ossClient ...

  9. 阿里云OSS图片上传类

    1.阿里云基本函数 /** * 把本地变量的内容到文件 * 简单上传,上传指定变量的内存值作为object的内容 */ public function putObject($imgPath,$obje ...

随机推荐

  1. 横竖屏切换时不销毁当前activity 和 锁定屏幕

    首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性 <act ...

  2. visual studio 设置代码注释模板

    1.C#模板文件: 路径:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ItemTemplates\CSharp\Co ...

  3. request.getRequestURI() 、request.getRequestURL() 、request.getContextPath()、request.getServletPath()区别

    request.getRequestURI() /jqueryWeb/resources/request.jsprequest.getRequestURL() http://localhost:808 ...

  4. 面向对象的Shell脚本

    还记得以前那个用算素数的正则表达式吗?编程这个世界太有趣了,总是能看到一些即别出心裁的东西.你有没有想过在写Shell脚本的时候可以把你的变量和函数放到一个类中?不要以为这不可能,这不,我在网上又看到 ...

  5. JPA学习笔记(8)——映射一对多关联关系

    一对多关联关系 本文有很多和多对一是一样的,因此不会写得非常具体. 有看不懂的.能够參考JPA学习笔记(7)--映射多对一关联关系 Order实体类 package com.jpa.helloworl ...

  6. java中基础数据类型的应用

    1.float 与 double float是单精度类型,占用4个字节的存储空间  double是双精度类型,占用8个字节的存储空间  1)当你不声明的时候,默认小数都用double来表示,所以如果要 ...

  7. maven配置src/resources默认目录

    在maven工程中,我们会将配置文件放到,src/main/resources   下面,例如 我们需要确认resource 下的文件 编译之后存放的位置 它编译的路径直接位于classes下面,这个 ...

  8. 如何将 .net2.0注册到IIS ,重新注册IIS

    打开程序-运行-cmd:输入一下命令重新注册IIS C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i 一.运行C:\ ...

  9. Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换

    Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换 解决方法:添加格式说明信息 将下面语句: \docum ...

  10. 给Elasticsearch 5.2.2 设置用户权限 how to setting security for elasticsearch on windows

    1. download the plugin of elasticsearch: 下载 readonlyrest-1.14.0_es5.2.2.zip 2. install readonlyrest ...