0

ファイルをblobとしてデータベースにアップロードして保存するために、joomlaでコンポーネントを作成しました。ファイルは正常にアップロードされているようですが、ダウンロードしようとするとエラーが発生します。

7-Zip [64] 9.20 Copyright(c)1999-2010 Igor Pavlov 2010-11-18 p7zipバージョン9.20(locale = en_US.UTF-8、Utf16 = on、HugeFiles = on、8 CPU)

Error: /tmp/payeddownloadsvisits-17.zip: Can not open file as archive

Errors: 1

これは私が試したことです

<div id="dialog" title="Basic dialog" style="display:none;">    
   <form enctype="multipart/form-data" action="index.php?option=com_virtuemart&view=payeddownloads&task=uploadfile" method="post">
        <table>
            <tr><td>Product</td><td><select id="product" name="product"></td></tr>
            <tr><td>File</td><td><input name="file" type="file" id="file"/></td></tr>
            <tr><td></td><td><input name="upload" type="submit" id="upload" value=" Upload "></td></tr>
            <tr><td></td><td></td></tr>
        </table>
        <input type="hidden" name="MAX_FILE_SIZE" value="2000000">          

    </form>
    <progress style="display:none;" id="progress"></progress>   
</div>

これがコントローラー機能です

function uploadfile()
     {      
        $payeddownloadsModel = VmModel::getModel('payeddownloads');
        $payeddownloads = $payeddownloadsModel->uploadfile();

        JRequest::setVar('view', 'payeddownloads');
        JRequest::setVar('layout','default');        
        parent::display();                                      
     }

これがモデル関数です

public function uploadfile(){       
         $input = new Jinput;
         $virtuemart_product_id = $input->get('product');

         $fileName = $_FILES['file']['name'];
         $tmpName =  $_FILES['file']['tmp_name'];
         $fileSize = $_FILES['file']['size'];
         $fileType = $_FILES['file']['type'];
         $fp = fopen($tmpName, 'r');
         $content = fread($fp, filesize($tmpName));
         $content = addslashes($content);
         fclose($fp);

         if(!get_magic_quotes_gpc())
         {
         $fileName = addslashes($fileName);
         }


         $data =new stdClass();
         $data->id = null;
         $data->virtuemart_product_id = $virtuemart_product_id; 
         $data->file_size = $fileSize;
         $data->file_name = $fileName;
         $data->file_type = $fileType;
         $data->file_blob = $content;
         $data->reg_date = date("Y-m-d H:i:s");

         $db = JFactory::getDBO();
         $db->insertObject( '#__virtuemart_payeddownload_productfiles', $data, 'id' );

    }

ファイルは次の構造でテーブルに挿入されます

CREATE TABLE `ivf27_virtuemart_payeddownload_productfiles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `virtuemart_product_id` varchar(45) DEFAULT NULL,
  `file_blob` blob,
  `file_size` varchar(45) DEFAULT NULL,
  `file_name` varchar(200) DEFAULT NULL,
  `file_type` varchar(45) DEFAULT NULL,
  `reg_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8$$

しかし、私がそれをダウンロードしようとすると:

public function getfile(){

        $jinput = JFactory::getApplication()->input;        
        $file_id = $jinput->get('file_id','','INT');        

        $sql = "select * from #__virtuemart_payeddownload_productfiles where id=$file_id";
        $db = JFactory::getDBO();       
        $db->setQuery($sql);
        $results = $db->loadObjectList();
        $file_size = $results[0]->file_size;
        $file_type = $results[0]->file_type;
        $file_name = $results[0]->file_name;
        $file_blob = $results[0]->file_blob;


        header('Content-Description: File Transfer');           
        header("Content-Type: $file_type");
        header("Content-Disposition: attachment; filename= $file_name");
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . strlen($file_blob));

        ob_clean();
        flush();

        echo $file_blob;
        exit;
    }

ブラウザから次のメッセージが表示されます。

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)

Error: /tmp/payeddownloadsvisits-17.zip: Can not open file as archive

Errors: 1

しかし、私はjoomlaフレームワークの外でtest.phpファイルを作成し、次のようにファイルを再度アップロードしました。

<?php         
 include("config.php");

 $fileName = $_FILES['userfile']['name'];
 $tmpName =  $_FILES['userfile']['tmp_name'];
 $fileSize = $_FILES['userfile']['size'];
 $fileType = $_FILES['userfile']['type'];
 $fp = fopen($tmpName, 'r');
 $content = fread($fp, filesize($tmpName));
 $content = addslashes($content);
 fclose($fp);

 if(!get_magic_quotes_gpc())
 {
 $fileName = addslashes($fileName);
 }

 $query = "INSERT INTO ivf27_virtuemart_payeddownload_productfiles set file_name='".$fileName."', file_size='".$fileSize."', file_type='".$fileType."', file_blob='".$content."'";        
 mysql_query($query) ;    
?>     

ファイルは期待どおりに正常にアップロードされます+戻ってjoomlaからダウンロードすると、開くことができます-解凍して通常どおりに読み取ります。

したがって、この問題は、joomla2.5フレームワークからファイルをアップロードした場合にのみ発生します。ファイルをダウンロードできますが、解凍できません。joomlaの外部からファイルをアップロードすると、通常どおりファイルをダウンロードして解凍できます。

これを引き起こしているのは何ですか?どうすれば修正できますか?

4

1 に答える 1

1

データベースに保存する前にコンテンツにスラッシュを追加しましたが、取得後にスラッシュを削除していません。セキュリティ上の目的でアドスラッシュを使用するのをやめ、データベース機能を使用すれば、自分のデータを壊すことはありません

于 2012-10-17T07:07:46.467 に答える