phpcms モジュール開発における swfupload の使用の概要_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:11:05
オリジナル
1003 人が閲覧しました

phpcms モジュール開発に正式に連絡した後、いくつかの機能モジュールを開発しました。その中で、画像の一括アップロードの問題に遭遇したため、phpcms での swfupload の使用方法を検討し始めました。

phpcms に付属のコンテンツ タイプでは、画像グループを直接指定できますが、この画像グループ機能は、静的な HTML ファイル全体をアップロードする必要があるものではありません。

フォルダー全体をアップロードする方法を見つけて、元のファイル名を維持できるようになりました。

その目的は次のように要約されます:

1、システムのファイルとディレクトリ構造を変更しないでください。

2、複数の添付ファイルをアップロードする機能を実現します。

3、アップロード後にフォルダー名を取得できます。

phpcms には添付ファイルのアップロード機能が付属しています。swfupload 関数を使用したいのですが、この関数は phpcms の添付ファイルのアップロード機能に統合されています。その後、それを抽出して変更する必要があります。

最初のステップは、これを呼び出す方法を勉強することです。

まず、Firefox ブラウザで firebug を開き、ネットワーク パネルを開き、phpcm で swfupload によって呼び出されるボタンを見つけます。


コードをコピーします。 コードは次のとおりです。

?m=attachment&c=attachments&a=swfupload&args=10,,1&module=&catid=&authkey=b756a93dea2e627293e88fa9d62af709&pc_hash=iXFbo1このようなリクエストの束を、添付ファイル モジュールの添付ファイル コントローラーでキャプチャしました。
このモジュールのこのコントローラーでこのメソッドを見つけてみましょう。

phpcms/modules/attachemet/attachemts.php内
例 開いて見てください。コードは次のとおりです。

コードをコピーします。

次のコードを実行します。


Public Function SWFUPLOAD () {
$ Grouplist = getcache ('grouplist', 'member'); 'dosubmit'])){

アップロード後の処理なので、とりあえずはswfuploadの導入方法を調べる必要があります。 } else { if($ this-> ;isadmin==0 && !$grouplist[$this->groupid]['allowattachment']) showmessage (L('att_no_permission')); $authkey = $_GET['authkey'];//Get鍵 _GET['args']));//パラメータの分割 = sizecount($site_setting['upload_maxsize']*1024) // アップロード サイズを許可します $att_not_used = param: :get_cookie('att_json'); //未処理のファイルリストを取得します
!isset($att_not_used)) $tab_status = ' class ="on"';//未処理の設定がある場合、ラベル スタイルはオンになります
if(!empty($att_not_used)) $div_status = 'hidden';// それ以外の場合はタグを非表示にします
’を通じて .

前の部分は無視して、アップロードについて説明します。まず、添付ファイルのアップロードが許可されているかどうかを確認します。 次に、$_GET から swfupload のパラメータ引数を取得し、キーを確認して、引数を解析するためのキー パスを取得し、Web サイトの設定を取得し、アップロードが許可されている添付ファイルのサイズを取得します。添付ファイルの Cookie リストの未使用の値。

テンプレートでさまざまな表示を設定します。 最後で最も重要なことは、このテンプレートを見つけて swfupload がどのように導入されるかを確認する必要があるということです。

テンプレートはここにあります: phpcms/modules/attachment/templates/swfupload.tpl.php

テンプレート ファイルを開きます。テンプレート ファイルには多数のファイルが導入されています。


コードをコピーします。 コードは次のとおりです。 admin_tpl ('header', 'attachment');?>
< ;script language="JavaScript" type="text/javascript" src="swfupload/fileprogress.js">




まず、ヘッダーファイルを紹介します。これには jquery などが含まれています。後で使用する必要があるときに、このヘッダーもインポートします。

その後、swfupload のスタイル ファイルと必要な JS がここで呼び出されます。この関数は何をしますか?
この行を過小評価しないでください。swfupload の設定全体がここにあります。
この機能を探してみましょう

phpcms/modules/attachment/functions/golable.func.php にその痕跡が見つかりました。この関数の主な機能は

コードをコピーすることです。コードは次のとおりです:


/* flash上传初始化
     * 初始化swfupload上传中需要的参数
     * @param $module 模块名称
     * @param $catid 栏目id
     * @param $args 传递参数
     * @param $userid 用户id
     * @param $groupid 用户组id
     * @param $isadmin 是否为管理员模式
     */
    function initupload($module, $catid,$args, $userid, $groupid = '8', $isadmin = '0'){
        $grouplist = getcache('grouplist','member');
        if($isadmin==0 && !$grouplist[$groupid]['allowattachment']) return false;
        extract(getswfinit($args));
        $siteid = param::get_cookie('siteid');
        $site_setting = get_site_setting($siteid);
        $file_size_limit = $site_setting['upload_maxsize'];
        $sess_id = SYS_TIME;
        $swf_auth_key = md5(pc_base::load_config('system','auth_key').$sess_id);
        $init =  'var swfu = \'\';
        $(document).ready(function(){
        swfu = new SWFUpload({
            flash_url:"'.JS_PATH.'swfupload/swfupload.swf?"+Math.random(),
            upload_url:"'.APP_PATH.'index.php?m=attachment&c=attachments&a=swfupload&dosubmit=1",
            file_post_name : "Filedata",
            post_params:{"SWFUPLOADSESSID":"'.$sess_id.'","module":"'.$module.'","catid":"'.$_GET['catid'].'","userid":"'.$userid.'","siteid":"'.$siteid.'","dosubmit":"1","thumb_width":"'.$thumb_width.'","thumb_height":"'.$thumb_height.'","watermark_enable":"'.$watermark_enable.'","filetype_post":"'.$file_types_post.'","swf_auth_key":"'.$swf_auth_key.'","isadmin":"'.$isadmin.'","groupid":"'.$groupid.'"},
            file_size_limit:"'.$file_size_limit.'",
            file_types:"'.$file_types.'",
            file_types_description:"All Files",
            file_upload_limit:"'.$file_upload_limit.'",
            custom_settings : {progressTarget : "fsUploadProgress",cancelButtonId : "btnCancel"},

            button_image_url: "",
            button_width: 75,
            button_height: 28,
            button_placeholder_id: "buttonPlaceHolder",
            button_text_style: "",
            button_text_top_padding: 3,
            button_text_left_padding: 12,
            button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
            button_cursor: SWFUpload.CURSOR.HAND,

File_dialog_Start_handler: FileDialogStart、

File_queued_handler: FileQueued、
File_queue_error_handler: File_Dialog_Complete_handler : FileDialogComplete、
Upload_progress_handler: アップロードプログレス、
アップロード_エラー_ハンドラー: アップロードエラー、
UPload_success_handler: s、lアップロード完了ハンドラー: アップロード完了
});
}) '; $init を返します。
}


テンプレート swfupload.tpl.php を見てみましょう。
このテンプレートは、タブの形式で表示されるように js を使用して、swfupload ボタンを含むタブの ID を見つけることができます。
その ID は tab_swf_1 です


これは div であり、コードは次のとおりです。

コードをコピーします
コードは次のとおりです:

="button" id="btupload" value="" onClick="swfu.startUpload ();" />
>onShow">& lt;font color="red"> /font> , < ;/div>
;/div> change_params()">
PAD-10 "ID =" SWFUPLOAD "& GT;
& LT; Legend & GT; & LT;? PHP Echo L ('リスト')? -list "id =" fsuploadprogress ">
"
ここでは、ID が buttonPlaceHolder であるスパンがあり、構成ファイルに button_placeholder_id: "buttonPlaceHolder" という行があることがわかります。ページがロードされると、ID が buttonPlaceHolder である要素が JS に置き換えられることは明らかです。 swfupload アップロード コントロールを使用します。 次のステップは、ファイルをクリックした後に swf アップロード メソッドをトリガーすることです

コード内に次のコードがあります。このメソッドは swfupload.js で定義されています。


コードは次のとおりです:
< ;input type="button" id="btupload" value="" onClick="swfu.startUpload(); " />


これです。swfupload のアップロード コントロールの使用方法はすでに見つかりました
プログラム内でこれを呼び出す方法

まず最初に、これらの必要なファイルをこのコントロールに表示されるテンプレートに導入する必要があります


コードをコピーします コードは次のとおりです:


< script type="text/javascript ">
userid,$this->groupid ,$this->isadmin )?>



コードは上記の通りです
次に、テンプレート内の swfupload を配置する場所にそのようなタグを記述します


コードをコピーします コードは次のとおりです:
< ; input type="button" id="btupload" value="" onClick="swfu.startUpload();


このようにして swfupload を導入しました。必要な場合は、アップロードやその他の機能を通常どおりに実行できます。
しかし、これではまだ私たちのニーズを満たせません。そして、ファイルを Shenma にアップロードしました。その後、私たちを見つけてファイルを Shenma にアップロードします。
設定ファイル(initupload関数で出力されたもの)にこのような行があります

コードをコピーします

コードは次のとおりです:upload_url:"'.APP_PATH.'index.php?m=attachment&c =attachments&a=swfupload&dosubmit=1 ",
これは明らかに、ファイルを処理するために添付モジュールの添付ファイル コントローラーの swfupload メソッドにファイルをアップロードしたことを明らかにしています

ここは今まで気にしていなかったifの中の物です

取り出して見てください

コードをコピーしてください

コードは次のとおりです:

if( $_POST['swf_auth_key'] != md5(pc_base::load_config('system','auth_key').$_POST['SWFUPLOADSESSID']) || ($_POST['isadmin']==0 && !$grouplist[$_POST['groupid']]['allowattachment'])) exit();
pc_base::load_sys_class('attachment','',0);
$attachment = 新しい添付ファイル($_POST[ 'module'],$_POST['catid'],$_POST['siteid']);
$attachment->set_userid($_POST['userid']);
$aids = $attachment->upload( 'Filedata',$_POST['filetype_post'],'','',array($_POST['thumb_width'],$_POST['thumb_height']),$_POST['watermark_enable']);
if($ aids[0]) {
$filename= (strto lower(CHARSET) != 'utf-8') ? iconv('gbk', 'utf-8', $attachment->uploadedfiles[0]['filename']) : $attachment->uploadedfiles[0]['filename'];
if($attachment-> ;uploadedfiles[0]['isimage']) {
echo $aids[0].','.$this->upload_url.$attachment->uploadedfiles[0]['filepath'].','。 $attachment->uploadedfiles[0]['isimage'].','.$filename;
} else {
$fileext = $attachment->uploadedfiles[0]['fileext'];
if($fileext == 'zip' || $fileext == 'rar') $fileext = 'rar';
elseif($fileext == 'doc' || $fileext == 'docx') $fileext = 'doc';
elseif($fileext == 'xls' || $fileext == 'xlsx') $fileext = 'xls';
elseif($fileext == 'ppt' || $fileext == 'pptx') $fileext = ' ppt';
elseif ($fileext == 'flv' || $fileext == 'swf' || $fileext == 'rm' || $fileext == 'rmvb') $fileext = 'flv';
else $fileext = 'do';
echo $aids[0].','.$this->upload_url.$attachment->uploadedfiles[0]['filepath'].','.$fileext.', '.$filename;
}
exit;
} else {
echo '0,'.$attachment->error();
exit;

この里面がある行は比較的重要です。

最初にシステムのアタッチメント クラスをロードし、ここに到達する方法を使用します。

程序对上传成功做了echooperation.返還的东西是 返了编号,上传后的地址,拓展名,文件名.

これらの西は给谁用の啊 我们还得回去看構成文件.

構成ファイルの一部は、上転送中に各イベントがトリガーする方法です。  有始上传的.有上成功的,有上传失的.等等.

私が見ることができる方法の 1 つは、file_dialog_complete_handler:fileDialogComplete,

これらは swfupload に達しました。

その後私はphpcms/static/swfupload/handler.js里面にあるこの方法に到達しました。

上での転送が成功した後にエコー結果の解析が完了したデータを参照してください。

解析的な方法


复制代代码如下:

function att_show(serverData,file)
{
var serverData = serverData.replace(//g,'');
var data =serverData.split(',') ;
var id = data[0];
var src = data[1];
var ext = data[2];
var filename = data[3];
if(id == 0) {
alert(src) )
return false;
}
if(ext == 1) {
var img = '
';
} else {
var img = '
';
}
$.get('index.php?m=attachment&c=attachments&a=swfupload_json&aid='+id+'&src='+src+'&filename='+filename);
$('#fsUploadProgress').append('< li>
');
$('#attachment_'+id).html(img );
$('#att-status').append('|'+src);
$('#att-name').append('|'+filename);
}

この方法による目的は、id が fsuuploadprogress の要素の領域に、成功した添付ファイルを追加することです。 关键の地方来了.我们swfupload方法里面に添付ファイルがないシステムタイプの例

真正上传添付ファイルはここにあります。私は添付ファイルのアップロード方法を使用してファイルを上送信します。

この添付ファイルファイルのアップロード方法はシステムクラスの場所にあります、つまり phpcms/libs/classes/attachment.class.php の場所です

この里面に私達はアップロード方法里面にアクセスできます


复制码代码如下:
$this->savepath = $this->upload_root.$this->upload_dir .date ('Y/md/');

この自然就是指定了上传到目录.文件名是通过getnameメソッド来获取的.

到此里我们就理清思路了。

システムはこれを実行しています

最初にモジュールパネルの面で swfupload(配置ファイルは関数用に生成されたもの) -> 上転送ファイル -> 添付ファイルモジュールの swfupload メソッドを参照して処理 (システムの添付ファイルのアップロードメソッドを使用してアクセサリを循環します。) 結果を swfupload に返します。メソッド)->処理結果 swfupload 経由のメソッド(fileDialogComplete) が返されます。

上面我们已经实现了在模板里面導入swfupload.但我们使用的配置文件及上传付属品的方法等都是系原来自带的。并现我想要的目录结构和文件命名方法。怎么办。 .

変更

怎么改、最初们要配置文件改掉。 自己のモジュールの領域にある関数ファイルの領域に自己の関数が確立されています。我们用自己の関数名 文件命名はglobal.func.phpこのシステム统会はauto_loadを介して我们の関数数追加

去我们把系统中添付モジュール関数文件下面のglobal.func.php里面のinitupload関数全盘コピー贝进来.只修正その中の一行


复制番号代次:
upload_url :「」。 APP_PATH.'index.php?m=你的モジュール名&c=你的制御器名&a=你的メソッド名&dosubmit=1",

この文件は我们的制御器下面に提交します。写す方法
その後、私はシステムのattachment クラスを削除します。私は自分のモジュールの下にあるクラスファイルを下面に構築します。myattachment.class.php

一我我们自己的分類。集成系の添付ファイル分類を外します。(私有方法コピー过来来。)我们要修正行。最初一点はアップロード方法里面の上传目录変更です。その後、文書を修正します。命名方法.


复制代码代码如下:

function upload($field, $alowexts = '', $maxsize = 0, $overwrite = 0,$thumb_setting = array(), $watermark_enable = 1) {
        if(!isset($_FILES[$field])) {
            $this->error = UPLOAD_ERR_OK;
            return false;
        }
        if(empty($alowexts) || $alowexts == '') {
            $site_setting = $this->_get_site_setting($this->siteid);
            $alowexts = $site_setting['upload_allowext'];
        }
        $fn = $_GET['CKEditorFuncNum'] ? $_GET['CKEditorFuncNum'] : '1';

        $this->field = $field;
        $this->savepath = $this->upload_root.$this->upload_dir.date('Ymd');//这里我们需要修改下.也可以不修改.在我们实例化这个类的时候再来指定目录.
        $this->alowexts = $alowexts;
        $this->maxsize = $maxsize;
        $this->overwrite = $overwrite;
        $uploadfiles = array();
        $description = isset($GLOBALS[$field.'_description']) ? $GLOBALS[$field.'_description'] : array();
        if(is_array($_FILES[$field]['error'])) {
            $this->uploads = count($_FILES[$field]['error']);
            foreach($_FILES[$field]['error'] as $key => $error) {
                if($error === UPLOAD_ERR_NO_FILE) continue;
                if($error !== UPLOAD_ERR_OK) {
                    $this->error = $error;
                    return false;
                }
                $uploadfiles[$key] = array('tmp_name' => $_FILES[$field]['tmp_name'][$key], 'name' => $_FILES[$field]['name'][$key], 'type' => $_FILES[$field]['type'][$key], 'size' => $_FILES[$field]['size'][$key], 'error' => $_FILES[$field]['error'][$key], 'description'=>$description[$key],'fn'=>$fn);
            }
        } else {
            $this->uploads = 1;
            if(!$description) $description = '';
            $uploadfiles[0] = array('tmp_name' => $_FILES[$field]['tmp_name'], 'name' => $_FILES[$field]['name'], 'type' => $_FILES[$field]['type'], 'size' => $_FILES[$field]['size'], 'error' => $_FILES[$field]['error'], 'description'=>$description,'fn'=>$fn);
        }

        if(!dir_create($this->savepath)) {
            $this->error = '8';
            return false;
        }
        if(!is_dir($this->savepath)) {
            $this->error = '8';
            return false;
        }
        @chmod($this->savepath, 0777);

if(!is_writeable($this->savepath)) {
$this->error = '9';
return false;
}
if(!$this->is_allow_upload()) {
$this ->error = '13';
return false;
}
$aids = array();
foreach($uploadfiles as $k=>$file) {
$fileext = fileext['name ' ]);
if($file['error'] != 0) {
$this->error = $file['error'];
return false;
}
}
if(!preg_match("/^( ".$this->alowexts.")$/", $fileext)) {
$this->error = '10';
return false;
}
if($this-&g t;最大サイズ && $file ['size'] > $this->maxsize) {
$this->error = '11';
return false;
}
if(!$this-> file($file['tmp_name' ])) {
$this->error = '12';
return false;
}
//$temp_filename = $this->getname($fileext);//名前この里.我们必要修正下
$temp_filename = $file['tmp_name'].$fileext; //修正オリジナルのシステムファイル名.
$savefile = $this->savepath.$temp_filename; $savefile = preg_replace("/(php|phtml|php3|php4|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(.|$)/i" 、"_\1\2"、$savefile); $filepath = preg_replace(new_addslashes("|^".$this->upload_root."|"), "", $savefile); if(!$this->上書き && file_exists($savefile)) 続行; $upload_func = $this->upload_func; if(@$upload_func($file['tmp_name'], $savefile)) { $this->uploadeds++; @chmod($savefile, 0644); @unlink($file['tmp_name']); $file['name'] = iconv("utf-8",CHARSET,$file['name']); $uploadedfile = array('filename'=>$file['name'], 'filepath'=>$filepath, 'filesize'=>$file['size'], 'fileext'=>$fileext , 'fn'=>$file['fn']); $thumb_enable = is_array($thumb_setting) && ($thumb_setting[0] > 0 || $thumb_setting[1] > 0 ) ? 1:0; $image = 新しい画像($thumb_enable,$this->サイトid); if($thumb_enable) { $image->thumb($savefile,'',$thumb_setting[0],$thumb_setting[1]); if($watermark_enable) { $image->watermark($savefile, $savefile); $aids[] = $this->add($uploadedfile); $aids を返します。 }


注:この里我们は再システムの添付モジュールを下構築MY_attachment.php ただし、これは样会影响系の添付ファイル上传機能です。


在我们自己的制御器里面.我们今回候就追加自己書込的类了.

复制代码
代码如下:


pc_base::load_app_class('你的モジュール名',' ',0);
🎜
残りの操作は、システムの接続モジュールの下にある接続コントローラーの swfupload メソッドを参照することで変更できます。

これで、システムファイルディレクトリを変更せずに、目的のファイルアップロード機能が完成しました。

http://www.bkjia.com/PHPjc/326932.html

tru​​ehttp://www.bkjia.com/PHPjc/326932.html技術記事 phpcms モジュール開発に正式に連絡した後、いくつかの機能モジュールを開発しました。その中で、画像の一括アップロードの問題に遭遇しました。そこで、phpcms での swfupload の使用方法を検討し始めました。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!