0

我在 joomla 中制作了一个组件,以便将文件上传并保存为数据库中的 blob。该文件似乎正在正常上传,但是当我尝试下载它时出现错误:

7-Zip [64] 9.20 版权所有 (c) 1999-2010 Igor Pavlov 2010-11-18 p7zip 版本 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

在视图中,这是我尝试过的

<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下载它时,我可以打开它 - 解压缩并正常阅读。

所以只有当我从 joomla 2.5 框架上传文件时才会出现问题。我可以下载文件,但无法解压缩。如果我从 joomla 外部上传文件,我可以正常下载文件并解压缩。

是什么原因造成的,我该如何解决?

4

1 回答 1

1

在保存到数据库之前,您已经在内容中添加了斜线,但在检索到内容后没有去除它们。出于安全目的停止使用addlashes,使用数据库功能,您不会破坏自己的数据

于 2012-10-17T07:07:46.467 回答