上传文件至阿里云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. [VB.NET Tips]VB.NET专有的字符串处理函数

    .NET Framework类库中含有专门为Visual Basic.NET程序员设计的函数和过程. 这些方法虽然是为VB.NET程序员设计的,但是也可以被.NET Framework上支持的任何语言 ...

  2. KeyValue对RDDs

    创建KeyValue对RDDs 使用函数map,返回keyvalue对 例如,包含数行数据的RDD,那每行的第一个单词作为keys. sparl.txt中的内容如下: hello ! hello wo ...

  3. [Spark] 04 - HBase

    BHase基本知识 基本概念 自我介绍 HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”. ...

  4. 从零开始OpenGL—— 一、 环境配置

    前言 高考完之后填志愿,当时想以后去做游戏,所以选择了计算机这个专业,之前捣鼓过U3D,这学期也开始了计算机图形学的学习,最近学习了OpenGL相关的一些内容,将在博客中记录这系列的学习.这篇开篇博客 ...

  5. Spring boot 梳理 - WebMvcConfigurer接口 使用案例

    转:https://yq.aliyun.com/articles/617307 SpringBoot 确实为我们做了很多事情, 但有时候我们想要自己定义一些Handler,Interceptor,Vi ...

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

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

  7. freemarker常用属性

    1.th:action 定义后台控制器的路径,类似<form>标签的action属性. 示例如下. <form id="login" th:action=&quo ...

  8. thymeleaf 语法

    一.语法: 1. 简单表达式 (simple expressions) ${...}  变量表达式 *{...}  选择变量表达式 #{...}  消息表达式 @{...}  链接url表达式 2.字 ...

  9. Java 学习笔记之 线程安全

    线程安全: 线程安全的方法一定是排队运行的. public class SyncObject { synchronized public void methodA() { try { System.o ...

  10. Scala 学习笔记之函数(1)

    class Student { val mySayHello1: String => Unit = sayHello val mySayHello2: (String, Int) => U ...