上传文件至阿里云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. ActiveMQ高级特性

    一.常用配置属性 以下配置文件目录均为:${activemq_home}/conf/activemq.xml 1.定期扫描清理 ActiveMQ中有一项功能:Delete Inactive Desti ...

  2. 【Java】SpringBoot 中从application.yml中获取自定义常量

    由于这里我想通过java连接linux,connection连接需要host.port.username.password及其他路径等等.不想每次修改的时候都去改源文件,所以想写在applicatio ...

  3. FTP无法登录问题-内有网盘福利

    http://dinghuqiang.blog.51cto.com/19871/701185/ 一顿操作猛如虎,还是没解决. 然后我想想,会不会是浏览器缓存问题? 换个火狐登录看看! 哇擦!看到报错了 ...

  4. 关于CDH集群spark的三种安装方式简述

    一.spark的命令行模式 1.第一种进入方式:执行 pyspark进入,执行exit()退出 注意报错信息:java.lang.IllegalArgumentException: Required ...

  5. CreateFolder

    import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apac ...

  6. Mybaits-从零开始-Spring、Spring MVC、MyBatis整合(未万待续)

    Spring.Spring MVC.MyBatis整合(未万待续)

  7. 第一个SharePoint Add-in工程

    一.创建SharePoint hosted 工程 1.创建承载SharePoint Add-in独立域 首先,确定承载的应用程序的独立域名,可以使用类似这样的域名apps.contoso.com,鉴于 ...

  8. .net core 3.0 Signalr - 02 使用强类型的Hub

    ## 强类型的优缺点 - 优点 强类型的Hub可以避免魔法函数名,相比弱类型更容易维护和发现问题,直接上代码 - 缺点 特么的得多些好几行代码 ## 代码 ### 接口定义 ``` C# /// // ...

  9. Spring Boot 整合视图层技术

    这一节我们主要学习如何整合视图层技术: Jsp Freemarker Thymeleaf 在之前的案例中,我们都是通过 @RestController 来处理请求,所以返回的内容为json对象.那么如 ...

  10. win10 cnpm安装完之后一直说不是内部命令的原因

    找到cnpm的默认安装路径 一般默认的是 D:\Program Files\nodejs\node_modules 然后添加环境变量中 win10是在系统环境变量中切记不是在用户变量中.保存之后,重新 ...