ファイルを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の外部からファイルをアップロードすると、通常どおりファイルをダウンロードして解凍できます。
これを引き起こしているのは何ですか?どうすれば修正できますか?