Codeigniterの写真アップロードシステムに問題があります。
コントローラへの登録中に写真をアップロードしてサイズ変更しています。それが完了すると、写真を再度表示したい「アップロード成功」ビューをロードします。
問題は、
- 私は実際には失敗していないように見える「失敗」ループに足を踏み入れます
と
- ビューを初めてロードしたとき、写真は表示されません(ただし、写真はアップロードされ、サイズが変更され、パスはDBにあります)。しかし、ページを更新すると、正しく表示されます。
これがコントローラーです..下部にあるコメントを確認してください。上部は基本的にサイズ変更ロジックであり、(今はちょっと醜いですが)機能します。
public function do_upload()
{
$config['upload_path'] = './upload_pic/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width'] = '1200';
$config['max_height'] = '768';
$_maxResizedWidth = '242';
$this->load->library('upload', $config);
if ( $this->upload->do_upload() )
{
$this->data['upload_data'] = $this->upload->data();
$this->data['title'] = "Upload Successful";
switch($this->data['upload_data']['file_type']){
case "image/jpg":
$_file_suffix = ".jpg";
break;
case "image/jpeg":
$_file_suffix = ".jpg";
break;
case "image/png":
$_file_suffix = ".png";
break;
case "image/gif":
$_file_suffix = ".gif";
break;
case "image/pjpeg":
$_file_suffix = ".jpg";
break;
}
$_fileName = $this->data['upload_data']['file_name'];
$_oldUploadPath = $config['upload_path'] . $_fileName;
$_random_key = strtotime(date('Y-m-d H:i:s'));
$_newUploadPath = $config['upload_path'] . 'resize_' . $_random_key . $_file_suffix;
rename( $_oldUploadPath, $_newUploadPath );
$_oldSize = getimagesize($_newUploadPath);
$_oldWidth = $_oldSize[0];
if($_oldWidth > $_maxResizedWidth){
$_scale = $_maxResizedWidth/$_oldWidth;
$_oldHeight = $_oldSize[1];
$_imageType = image_type_to_mime_type($_oldSize[2]);
$_newWidth = $_oldWidth * $_scale;
$_newHeight = $_oldHeight * $_scale;
$_resizedImage = imagecreatetruecolor($_newWidth, $_newHeight);
switch($_imageType) {
case "image/gif":
$_source=imagecreatefromgif($_newUploadPath);
break;
case "image/pjpeg":
case "image/jpeg":
case "image/jpg":
$_source=imagecreatefromjpeg($_newUploadPath);
break;
case "image/png":
case "image/x-png":
$_source=imagecreatefrompng($_newUploadPath);
break;
}
imagecopyresampled($_resizedImage, $_source, 0, 0, 0, 0, $_newWidth, $_newHeight, $_oldWidth, $_oldHeight);
switch($_imageType) {
case "image/gif":
imagegif($_resizedImage,$_newUploadPath);
break;
case "image/pjpeg":
case "image/jpeg":
case "image/jpg":
imagejpeg($_resizedImage,$_newUploadPath,90);
break;
case "image/png":
case "image/x-png":
imagepng($_resizedImage,$_newUploadPath);
break;
}
}
$_newUploadPathWithoutDot = substr($_newUploadPath,1);
$this->load->model('Member_model');
$ID = $this->the_user->id;
/// ****************************************************************************
/// I step into this next if loop even though the upload_photo method does work.
/// In my view I get the "there was a problem" .. but the DB has been correctly updated
if(!$this->Member_model->upload_photo( $ID, $_newUploadPathWithoutDot));
{
$uploadData = $this->upload->data();
$this->data['message'] = "There was a problem entering your photo in the database ==";
};
/// And this is the view that's called
$this->load->view('upload_big_success_view', $this->data);
}
else
{
$this->data['message'] = "there was a problem " . $this->upload->display_errors() . dirname(__FILE__);
$this->data['title'] = "Upload Unsuccessful";
$this->load->view('profile_photo_view', $this->data);
}
}
(そこには厄介なものがたくさんあることを知っているので、リファクタリングを行います)。
アップロード、サイズ変更、ファイルパスがDBに入力されているにもかかわらず、ビューが最初に読み込まれたときに画像が「準備ができていない」ように見えます...最後に到達するまでエラーはスローされませんでしたループし、「-> upload_photo()」が失敗したのに失敗したと思われるようです。そして、初めてビューを呼び出すと..
<img src"<?php echo $the_user->large_image_location; ?>" >
..出力を生成しません。しかし、単純な更新の後、それは行います。「問題のメッセージがありました」がまだビューに表示されていますが。
ところで-これがモデルです。特別なことは何もありません。
public function upload_photo($ID, $_newUploadPath)
{
$sql = "UPDATE users SET large_image_location=? WHERE id=?";
$query = $this->db->query($sql, array($_newUploadPath, $ID));
return $query;
}
それで、何かアイデアはありますか?