上传文件至阿里云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. Windows下更换MAC地址

    使用TMAC软件是最佳方案.官网地址:www.technitium.com

  2. 我用数据结构花了一夜给女朋友写了个h5走迷宫小游戏

    目录 起因 分析 画线(棋盘) 画迷宫 方块移动 结语 @(文章目录) 先看效果图(在线电脑尝试地址http://biggsai.com/maze.html): 起因 又到深夜了,我按照以往在公众号写 ...

  3. php 循环从数据库分页取数据批量修改数据

    //批量修改email重复 public function getEmail() { $this->model = app::get('shop')->model('manage'); / ...

  4. meta标签设置(移动端)

    一.首先出结论:移动端meta标签一般设置为: <meta content="width=device-width,initial-scale=1.0,maxinmum-scale=1 ...

  5. 自定义构建基于.net core 的基础镜像

    先说一个问题 首先记录一个问题,今天在用 Jenkins 构建项目的时候突然出现包源的错误: /usr/share/dotnet/sdk/2.2.104/NuGet.targets(114,5): e ...

  6. springboot + thymeleaf静态资源访问404

    在使用springboot 和thtmeleaf开发时引用静态资源404,静态资源结如下: index.html文件: <!DOCTYPE html> <html xmlns:th= ...

  7. 使用freemarker做邮件发送模板

    1.解析工具类 package com.example.springbootfreemarker.utils; import freemarker.template.Configuration; im ...

  8. 【转+】python为什么推荐使用多进程

    最近在看Python的多线程,经常我们会听到老手说:“Python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢?                要知其然,更要知其所以然.所以有了下面的深入研 ...

  9. 【SQL基础】char,nchar,vchar,nvchar之间的区别

    (1)       定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不足的补英文半角空格 varchar:  可变长度 ...

  10. Docker系列(一):容器监控工具Weave Scope安装

    项目进行容器化之后,配套的基础设施包括监控.编排.管理等都需要进行一并完善.这里也是自己一边学习一边进行记录. Weave Scope 的最大特点是会自动生成一张 Docker 容器地图,让我们能够直 ...