画像リサイザースクリプトの実装に問題がある:
<?php
// Create image from file
switch(strtolower($_FILES['Filedata']['type']))
{
case 'image/jpeg':
$image = imagecreatefromjpeg($_FILES['Filedata']['tmp_name']);
break;
case 'image/png':
$image = imagecreatefrompng($_FILES['Filedata']['tmp_name']);
break;
case 'image/gif':
$image = imagecreatefromgif($_FILES['Filedata']['tmp_name']);
break;
}
// Target dimensions
$max_width = 240;
$max_height = 180;
// Get current dimensions
$old_width = imagesx($image);
$old_height = imagesy($image);
// Calculate the scaling we need to do to fit the image inside our frame
$scale = min($max_width/$old_width, $max_height/$old_height);
// Get the new dimensions
$new_width = ceil($scale*$old_width);
$new_height = ceil($scale*$old_height);
// Create new empty image
$new = imagecreatetruecolor($new_width, $new_height);
// Resize old image into new
imagecopyresampled($new, $image,
0, 0, 0, 0,
$new_width, $new_height, $old_width, $old_height);
// Catch the imagedata
ob_start();
imagejpeg($new, NULL, 90);
$data = ob_get_clean();
// Destroy resources
imagedestroy($image);
imagedestroy($new);
?>
次のアップロードスクリプトに:
<?php
/* *
* upload avatar
*/
function uploadavatar()
{
$app = JFactory::getApplication();
$db = JFactory::getDBO();
$user = JFactory::getUser();
// load language for component media
JPlugin::loadLanguage( 'com_media', JPATH_SITE );
JPlugin::loadLanguage( 'com_media', JPATH_ADMINISTRATOR );
$params = JComponentHelper::getParams('com_media');
require_once( JPATH_SITE.DS.'components'.DS.'com_media'.DS.'helpers'.DS.'media.php' );
define('COM_AUP_MEDIA_BASE_IMAGE', JPATH_ROOT.DS.'components'.DS.'com_alphauserpoints'.DS.'assets'.DS.'images');
// Check for request forgeries
JRequest::checkToken( 'request' ) or jexit( 'Invalid Token' );
$file = JRequest::getVar( 'Filedata', '', 'files', 'array' );
$folder = JRequest::getVar( 'folder', 'avatars', '', 'path' );
$format = JRequest::getVar( 'format', 'html', '', 'cmd');
$return = JRequest::getVar( 'return-url', null, 'post', 'base64' );
$referrerid = JRequest::getVar( 'referrerid', '', 'post', 'string' );
$err = null;
// Set FTP credentials, if given
jimport('joomla.client.helper');
JClientHelper::setCredentialsFromRequest('ftp');
// Make the filename safe
jimport('joomla.filesystem.file');
$file['name'] = JFile::makeSafe($file['name']);
if (isset($file['name']) && $referrerid!='') {
$extention = JFile::getExt($file['name']);
$newnameavatar = strtolower($referrerid.'.'.$extention);
//chmod (COM_AUP_MEDIA_BASE_IMAGE.DS.$folder, 0755) ;
$filepath = JPath::clean(COM_AUP_MEDIA_BASE_IMAGE.DS.$folder.DS.$newnameavatar);
// erase old avatar
if ( file_exists($filepath) ) @unlink( $filepath );
if (!MediaHelper::canUpload( $file, $err )) {
if ($format == 'json') {
jimport('joomla.error.log');
$log = JLog::getInstance('upload.error.php');
$log->addEntry(array('comment' => 'Invalid: '.$filepath.': '.$err));
header('HTTP/1.0 415 Unsupported Media Type');
jexit('Error. Unsupported Media Type!');
} else {
JError::raiseNotice(100, JText::_($err));
// REDIRECT
if ($return) {
$app->redirect(base64_decode($return));
}
return;
}
}
if (JFile::exists($filepath)) {
if ($format == 'json') {
jimport('joomla.error.log');
$log = JLog::getInstance('upload.error.php');
$log->addEntry(array('comment' => 'File already exists: '.$filepath));
header('HTTP/1.0 409 Conflict');
jexit('Error. File already exists');
} else {
JError::raiseNotice(100, JText::_('UPLOAD FAILED. FILE ALREADY EXISTS'));
// REDIRECT
if ($return) {
$app->redirect(base64_decode($return));
}
return;
}
}
if (!JFile::upload($file['tmp_name'], $filepath)) {
if ($format == 'json') {
jimport('joomla.error.log');
$log = JLog::getInstance('upload.error.php');
$log->addEntry(array('comment' => 'Cannot upload: '.$filepath));
header('HTTP/1.0 400 Bad Request');
jexit('ERROR. UNABLE TO UPLOAD FILE');
} else {
JError::raiseWarning(100, JText::_('ERROR. UNABLE TO UPLOAD FILE'));
// REDIRECT
if ($return) {
$app->redirect(base64_decode($return));
}
return;
}
} else {
// SAVE IN PROFIL USER ALPHAUSERPOINTS
$query = "UPDATE #__alpha_userpoints" .
"\n SET avatar='".$newnameavatar."'" .
"\n WHERE referreid='".$referrerid."' AND userid='" . $user->id . "'"
;
$db->setQuery( $query );
if (!$db->query())
{
JError::raiseError( 500, $db->getErrorMsg() );
return false;
}
require_once (JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php');
if ($format == 'json') {
jimport('joomla.error.log');
$log = JLog::getInstance();
$log->addEntry(array('comment' => $folder));
jexit('Upload complete');
// apply rule for upload avatar
AlphaUserPointsHelper::userpoints( 'sysplgaup_uploadavatar', '', 0, $referrerid );
} else {
$app->enqueueMessage(JText::_('UPLOAD COMPLETE'));
// apply rule for upload avatar
AlphaUserPointsHelper::userpoints( 'sysplgaup_uploadavatar', '', 0, $referrerid );
// REDIRECT
if ($return) {
$app->redirect(base64_decode($return));
}
return;
}
}
} else {
$app->redirect('index.php', 'Invalid Request', 'error');
}
}
}
?>
$file文字列を$imageに置き換えようとしましたが、うまくいきませんでした。問題はこれだと思います:
$file = JRequest::getVar( 'Filedata', '', 'files', 'array' );
これと同じデータを取得しません:
$_FILES['Filedata']
それが私が問題を抱えている理由です。ただし、変換スクリプト自体はそれ自体で機能し、画像データを取得し、サイズを変更して画像を返します。問題は、現在のスクリプトで実装することです。
これを交換する場合:
$file = $_FILES['Filedata']
これとともに:
$file = JRequest::getVar( 'Filedata', '', 'files', 'array' );
同じ画像データを取得しますか?
しばらく時間がかかりますが、私は通常、この種のことをたくさん解決することができますが、これは私を立ち往生させます。私はまだそれを機能させる方法を知ることができるレベルではありません、私は試行錯誤によってこれをしなければなりません、そして研究と例を通して、それは難しいです。
偽造コメントのチェックの下に以下を配置し、$ file = ...を削除してみました。次に、残りの$file文字列を$newfileに変更しましたが、運が悪ければ、エラーが返されるか、サイズ変更が無視されます。スクリプト、$ file=...などを削除するかどうかによって異なります。
// Target dimensions
$max_width = 240;
$max_height = 180;
// Get current dimensions
$old_width = imagesx($file);
$old_height = imagesy($file);
// Calculate the scaling we need to do to fit the image inside our frame
$scale = min($max_width/$old_width, $max_height/$old_height);
// Get the new dimensions
$new_width = ceil($scale*$old_width);
$new_height = ceil($scale*$old_height);
// Create new empty image
$new = imagecreatetruecolor($new_width, $new_height);
// Resize old image into new
imagecopyresampled($new, file,
0, 0, 0, 0,
$new_width, $new_height, $old_width, $old_height);
// Catch the imagedata
ob_start();
imagejpeg($new, NULL, 90);
$filenew = ob_get_clean();
// Destroy resources
imagedestroy($file);
imagedestroy($new);