You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jy-sdk/Public/Home/images/FileController.class.php

263 lines
8.8 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace Admin\Controller;
use OSS\OssClient;
use Think\ShardUpload;
/**
* 文件控制器
* 主要用于下载模型的文件上传和下载
*/
class FileController extends AdminController {
/* 文件上传 */
public function upload(){
$return = array('status' => 1, 'info' => '上传成功', 'data' => '');
/* 调用文件上传组件上传文件 */
$File = D('File');
$file_driver = C('DOWNLOAD_UPLOAD_DRIVER');
$info = $File->upload(
$_FILES,
C('DOWNLOAD_UPLOAD'),
C('DOWNLOAD_UPLOAD_DRIVER'),
C("UPLOAD_{$file_driver}_CONFIG")
);
/* 记录附件信息 */
if($info){
$return['data'] = think_encrypt(json_encode($info['download']));
$return['info'] = $info['download']['name'];
} else {
$return['status'] = 0;
$return['info'] = $File->getError();
}
/* 返回JSON数据 */
$this->ajaxReturn($return);
}
/* 文件分片上传 */
public function shard_upload(){
//关闭缓存
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$uploader = new ShardUpload();
if(I('get.typee') == 1){//指定上传目录
$uploader->set('path','./Uploads/Ios/description');
}elseif(I('get.type') == "1"){
$uploader->set('path','./Uploads/Material');
}
//var_dump($_POST);
//用于断点续传,验证指定分块是否已经存在,避免重复上传
if(isset($_POST['status'])){
if($_POST['status'] == 'chunkCheck'){
$target = C('DOWNLOAD_UPLOAD.rootPath')."/".$_POST['name'].'/'.$_POST['chunkIndex'];
if(file_exists($target) && filesize($target) == $_POST['size']){
die('{"ifExist":1}');
}
die('{"ifExist":0}');
}elseif($_POST['status'] == 'md5Check'){
}elseif($_POST['status'] == 'chunksMerge'){
if($result = $uploader->chunksMerge($_POST['name'], $_POST['chunks'], $_POST['ext'])){
//todo 把md5签名存入持久层供未来的秒传验证
echo $result;
exit();
}
}
}
if(($path = $uploader->upload('file', $_POST)) !== false){
if(I('get.type') == "1"){
$file_info = json_decode($path,true);
$this->upload_oss("Material/",$file_info['name'],$file_info['path'].'/'.$file_info['name']);
$file_info['path'] = "http://".C('CND_ADDRESS')."/Material";
$path = json_encode($file_info);
}
die($path);
}
}
/* 苹果渠道包文件分片上传 */
public function ios_shard_upload(){
//关闭缓存
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$uploader = new ShardUpload();
//用于断点续传,验证指定分块是否已经存在,避免重复上传
if(isset($_POST['status'])){
if($_POST['status'] == 'chunkCheck'){
$target = C('DOWNLOAD_UPLOAD.rootPath')."/".$_POST['name'].'/'.$_POST['chunkIndex'];
if(file_exists($target) && filesize($target) == $_POST['size']){
die('{"ifExist":1}');
}
die('{"ifExist":0}');
}elseif($_POST['status'] == 'md5Check'){
}elseif($_POST['status'] == 'chunksMerge'){
if($result = $uploader->chunksMerge($_POST['name'], $_POST['chunks'], $_POST['ext'])){
//todo 把md5签名存入持久层供未来的秒传验证
echo $result;
exit();
}
}
}
if(($path = $uploader->iosUpload('file', $_POST)) !== false){
die($path);
}
}
/* 下载文件 */
public function download($id = null){
if(empty($id) || !is_numeric($id)){
$this->error('参数错误!');
}
$logic = D('Download', 'Logic');
if(!$logic->download($id)){
$this->error($logic->getError());
}
}
/**
* 上传图片
* @author huajie <banhuajie@163.com>
*/
public function uploadPicture(){
//TODO: 用户登录检测
/* 返回标准数据 */
$return = array('status' => 1, 'info' => '上传成功', 'data' => '');
/* 调用文件上传组件上传文件 */
$Picture = D('Picture');
$pic_driver = C('PICTURE_UPLOAD_DRIVER');
$info = $Picture->upload(
$_FILES,
C('PICTURE_UPLOAD'),
C('PICTURE_UPLOAD_DRIVER'),
C("UPLOAD_{$pic_driver}_CONFIG")
); //TODO:上传到远程服务器
/* 记录图片信息 */
if($info){
$return['status'] = 1;
$return = array_merge($info['download'], $return);
} else {
$return['status'] = 0;
$return['info'] = $Picture->getError();
}
ob_clean();
/* 返回JSON数据 */
$this->ajaxReturn($return);
}
/**
*上传到OSS
*/
public function upload_oss($oss_path,$file_name,$file_path)
{
/**
* 根据Config配置得到一个OssClient实例
*/
try {
Vendor('OSS.autoload');
$ossClient = new \OSS\OssClient(C("oss_storage.accesskeyid"), C("oss_storage.accesskeysecr"), C("oss_storage.domain"));
} catch (OssException $e) {
$this->error($e->getMessage());
}
$oss_file_path = $oss_path . $file_name;
$avatar = $file_path;
try {
$this->multiuploadFile($ossClient, C("oss_storage.bucket"), $oss_file_path, $avatar);
return true;
} catch (OssException $e) {
/* 返回JSON数据 */
$this->error($e->getMessage());
}
}
public function multiuploadFile($ossClient, $bucket, $url, $file)
{
//$file = __FILE__;
$options = array();
try {
#初始化分片上传文件
$uploadId = $ossClient->initiateMultipartUpload($bucket, $url);
//$ossClient->multiuploadFile($bucket, $url, $file, $options);
} catch (OssException $e) {
printf(__FUNCTION__ . ": initiateMultipartUpload FAILED\n");
printf($e->getMessage() . "\n");
return;
}
/*
* step 2. 上传分片
*/
$partSize = 5 * 1000 * 1024;
$uploadFile = $file;
$uploadFileSize = filesize($uploadFile);
$pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
$responseUploadPart = array();
$uploadPosition = 0;
$isCheckMd5 = true;
foreach ($pieces as $i => $piece) {
$fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
$toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
$upOptions = array(
$ossClient::OSS_FILE_UPLOAD => $uploadFile,
$ossClient::OSS_PART_NUM => ($i + 1),
$ossClient::OSS_SEEK_TO => $fromPos,
$ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
$ossClient::OSS_CHECK_MD5 => $isCheckMd5,
);
if ($isCheckMd5) {
$contentMd5 = \OSS\Core\OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
$upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
}
//2. 将每一分片上传到OSS
try {
$responseUploadPart[] = $ossClient->uploadPart($bucket, $url, $uploadId, $upOptions);
} catch (OssException $e) {
printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
printf($e->getMessage() . "\n");
return;
}
//printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} OK\n");
}
$uploadParts = array();
foreach ($responseUploadPart as $i => $eTag) {
$uploadParts[] = array(
'PartNumber' => ($i + 1),
'ETag' => $eTag,
);
}
/**
* step 3. 完成上传
*/
try {
$a = $ossClient->completeMultipartUpload($bucket, $url, $uploadId, $uploadParts);
} catch (OssException $e) {
printf(__FUNCTION__ . ": completeMultipartUpload FAILED\n");
printf($e->getMessage() . "\n");
return;
}
}
}