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

2、解压后,可自行修改目录名称,以下为本人项目实例(aliyun_oss改过之后的名称)

项目目录结构如下:

3、Index.php 为文件上传静态表单页

4、do_upload.php 为文件处理控制页,封装的代码如下:上传文件相关的辅助函数可以自行封装,本文是为了便于展示,全部放在一个文件中

 <?php
/**
* @Class: do_upload.php
* @Description: 控制器
* @Date: 2019/10/16
*/
header("Content-Type:text/html;charset=utf-8");
set_time_limit(0);
// error_reporting(E_ALL);
require __DIR__.'/AliyunOss.php';
if(!empty($_FILES['oss_file']) && !empty($_POST['type'])){
$file_arr = getFiles();
$AliyunOss = new AliyunOss();
   foreach ($file_arr as $file){
$res = upload_File($file,$type_name.'/'.$user_info['contact'],$user_info);
if(isset($res['fname']) && isset($res['dest']) && isset($res['file_name'])){
$result = $AliyunOss->upload_file($res['dest'],$res['fname']);
if($result){
//1、存入数据库 此处部分变量及入库代码补全 知道逻辑即可
$insert_time = date('Y-m-d H:i:s',time());
$fileData = array(
'phone' => "'{$phone}'",
'company_name' => "'{$oss_db->escape($user_info['contact'])}'",
'insert_time' => "'{$insert_time}'",
'file_name' => "'{$res['file_name']}'",
'file_url' => "'{$result['oss_file']}'"
);
$sql = "insert into `oss_file` (".implode(',', array_keys($fileData)).") values (".implode(',', array_values($fileData)).")";
$oss_db->query($sql);
if($oss_db->insert_id()){
//2、删除临时文件
unlink($res['dest']);
}
}
}
}
echo '上传成功';
header('Location:list.php');
die;
}else{
echo '上传失败';
} /**
* 文件上传
* @description
* @param $file
* @param string $path
* @param $max_size
* @param $allowExt
* @return mixed
*/
function upload_File($file,$oss_dir = '',$user_info,$path = __DIR__.'/temp'){
$filename=$file['name'];
$temp_name=$file['tmp_name'];
$error=$file['error'];
$res = [];
if ($error==UPLOAD_ERR_OK) {
// if ($size>$max_size) {
// $res['mes']=$filename."文件超过规定上传大小";
// }
$ext = getExt($filename);
if (in_array($ext, array('exe'))) {
$res['mes']=$filename.'非法的文件';
}
if (!is_uploaded_file($temp_name)) {
$res['mes']=$filename."文件不是通过HTTP POST 方法上传上传过来的";
} if ($res) {
return $res;
} if (!file_exists($path)) {
mkdir($path,0777,true);
chmod($path, 0777);
}
$fname = getUniName($filename,$user_info);
$destination = $path.'/'.$fname.'.'.$ext;
if (move_uploaded_file($temp_name, $destination)) {
$res['mes'] = $filename.'上传成功';
$res['dest'] = $destination;
$res['fname'] = $oss_dir.'/'.$fname.'.'.$ext;
$res['file_name'] = $fname.'.'.$ext;
}else{
$res['mes']=$filename."文件上传失败";
}
}else{
switch ($error) {
case '1':
$res['mes']="超过了配置文件上传文件的大小";
break;
case '2':
$res['mes']="超过表单设置上传文件文件的大小";
break;
case '3':
$res['mes']="文件部分被上传";
break;
case '4':
$res['mes']="没有文件被上传"; break;
case '6':
$res['mes']="没有找到临时目录";
break;
case '7':
$res['mes']="文件不可写"; break;
default:
$res['mes']="上传文件失败";
break;
}
} return $res; }
/**
* 获得文件扩展名
* @param string $filename 上传文件名
* @return string 返回扩展名
*/
function getExt($filename){
$arr=explode('.', basename($filename)); return end($arr);
}
/**
* 获得文件唯一扩展名
* @return string 经过md5后生成32位唯一的上传文件名
*/
function getUniName($fileName, $user_info)
{
$new_fileName = substr($fileName,0,strrpos($fileName,'.'));
$oss_db = new data_base('10.1.51.64', 'root', 'abc@123456', 'dahua_oss');
$has_file = $oss_db->getRow("select * from `oss_file` where `phone` = '{$user_info['phone']}' and locate('{$fileName}',`file_url`)>0 ");
if ($has_file) {
$new_fileName .= '-1';
}
return $new_fileName;
} /**
* 整理多个文件
* @description
* @return mixed
*/
function getFiles(){
$files = array();
foreach($_FILES as $file){
$fileNum=count($file['name']);
for ($i=0; $i < $fileNum; $i++) {
$files[$i]['name']=$file['name'][$i];
$files[$i]['type']=$file['type'][$i];
$files[$i]['tmp_name']=$file['tmp_name'][$i];
$files[$i]['error']=$file['error'][$i];
$files[$i]['size']=$file['size'][$i];
}
}
return $files;
} ?>

5、AliyunOss.php  OSS文件上传接口类 

 <?php
/**
* @Class: AliyunOss.php
* @Description: 控制器
* @Date: 2019/10/16
*/
header("Content-Type:text/html;charset=utf-8");
// error_reporting(E_ALL); if (is_file(__DIR__ . '/aliyun_oss/autoload.php')) {
require_once __DIR__ . '/aliyun_oss/autoload.php';
} use OSS\OssClient;
use OSS\Core\OssException; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 class AliyunOss
{
private $accessKeyId;
private $accessKeySecret;
private $endpoint;
private $bucket; public function __construct() {
require_once __DIR__ . '/aliyun_oss/config.php';
$this->accessKeyId = $oss_config['accessKeyId'];
$this->accessKeySecret = $oss_config['accessKeySecret'];
// Endpoint以杭州为例,其它Region请按实际情况填写。 $endpoint="http://oss-cn-hangzhou.aliyuncs.com";
$this->endpoint = $oss_config['endpoint'];
// 存储空间名称
$this->bucket = $oss_config['bucket'];
}
  //$file_path oss文件名称 (支持中文如:商务/科技/项目计划.doc)会自动创建目录
    //$file_name 由本地文件绝对路径加文件名包括后缀组成,例如/users/local/myfile.txt
public function upload_file($file_path, $file_name)
{
try {
$ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
$result = $ossClient->uploadFile($this->bucket, $file_name, $file_path);//$result['info']['url'] 返回上传成功的oss文件地址
$arr = array(
'oss_file' =>$result['info']['url'],
'local_path' => $file_name
);
return $arr;
} catch (OssException $e) {
// printf(__FUNCTION__ . ": FAILED\n");
// printf($e->getMessage() . "\n");
log_msg('文件上传失败',$e->getMessage());
log_msg('文件上传失败',$file_path.'---'.$file_name);
return false;
}
}
}
至此,OSS文件上传就完成了,具体使用过程中有什么问题,可随时反馈,同时也欢迎提出各种建议,谢谢!

PHP实现阿里云OSS文件上传(支持批量)的更多相关文章

  1. 构建基于阿里云OSS文件上传服务

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

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

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

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

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

  4. php阿里云oss文件上传

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

  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. .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件

    asp.net mvc请移步 mvc文件上传支持批量上传,拖拽以及预览,文件内容校验 本篇内容主要解决.net core中文件上传的问题  开发环境:ubuntu+vscode 1.导入所需要的包:n ...

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

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

随机推荐

  1. Codeforces Numbers 题解

    这题只需要会10转P进制就行了. PS:答案需要约分,可以直接用c++自带函数__gcd(x,y). 洛谷网址 Codeforces网址 Code(C++): #include<bits/std ...

  2. Pandas对缺失值的处理

    Pandas使用这些函数处理缺失值: isnull和notnull:检测是否是空值,可用于df和series dropna:丢弃.删除缺失值 axis : 删除行还是列,{0 or 'index', ...

  3. jenkins自动化部署项目2 --插件的选择和安装

    一.安装插件: 我选择的安装建议的插件,也可以自定义安装自己想要的插件,在不敢保证自己确定要用的插件是完全正确的情况下建议按推荐安装 我理解的jenkins+tomcat完成自动化部署maven项目需 ...

  4. Python学习笔记整理总结【ORM(SQLAlchemy)】

    一.介绍SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执 ...

  5. 为什么不使用SOAP进行点对点联系,而使用ESB呢

    图片截至: https://www.zhihu.com/question/29475224

  6. 【未完成】mysql数据库安全性配置——用户授权

    方式一:从服务设置授权 一:用户授权——从服务设置授权 (1)准备测试环境——不同服务器用户 首先,查看数据库连接当前用户情况,当前连接的只有root用户. select user,host,pass ...

  7. javascript中字符串对象常用的方法和属性

    前言 字符串是一种非常重要的数据类型,在Java等面向对象编程语言中,它代表对象类型,而在javascript中它却是一种基本数据类型,在开发的领域中,我们经常会碰到,无论是前端还是后台.比如后台验证 ...

  8. 使用.NET Core中创建Windows服务(一) - 使用官方推荐方式

    原文:Creating Windows Services In .NET Core – Part 1 – The "Microsoft" Way 作者:Dotnet Core Tu ...

  9. WebGL简易教程(九):综合实例:地形的绘制

    目录 1. 概述 2. 实例 2.1. TerrainViewer.html 2.2. TerrainViewer.js 3. 结果 4. 参考 1. 概述 在上一篇教程<WebGL简易教程(八 ...

  10. 防御 DDoS 的终极奥义——又拍云 SCDN

    现如今不论是年轻的 80.90 后,还是 70.60 后,都在享受互联网带来的舒适和便利.在家就可以"逛商场",完全不受时间的限制:在线支付既方便又安全:业余娱乐项目多种多样,打农 ...