我目前正在使用magento管理界面,尝试在“管理产品”中上传图片,我在浏览文件并点击“上传文件”后收到错误“文件未上传”。我看过其他论坛,我看到的主要解决方案是确保php.ini有以下几行......
magic_quotes_gpc = off
short_open_tag = on
extension=pdo.so
extension=pdo_mysql.so
我有带ISAPI_Rewrite的Windows / IIS。是否有最大文件上传大小,我可以在某处更改。我正在从我当地的桌面上传大小~100kb的图片。帮助!
答案 0 :(得分:7)
如果您在调试器中检查XHR响应,则会看到此{"error":"File was not uploaded.","errorcode":666}
此错误来自Varien_File_Uploader::__construct()
lib/Varien/File/Uploader.php
以下是重要部分
<?php
class Varien_File_Uploader
{
/**
* Uploaded file handle (copy of $_FILES[] element)
*
* @var array
* @access protected
*/
protected $_file;
const TMP_NAME_EMPTY = 666;
function __construct($fileId)
{
$this->_setUploadFileId($fileId);
if(!file_exists($this->_file['tmp_name'])) {
$code = empty($this->_file['tmp_name']) ? self::TMP_NAME_EMPTY : 0;
throw new Exception('File was not uploaded.', $code);
} else {
$this->_fileExists = true;
}
}
}
回顾一下你看到的痕迹,叫做
$uploader = new Mage_Core_Model_File_Uploader('image');
这是从Varien类扩展而来的,因此在这种情况下,Varien_File_Uploader::_setUploadFileId($fileId)
将根据键$this->_file
构建image
数组。
所以现在问题是why is $_FILES['image']['tmp_name']
empty?
我通过暂时将例外更改为
来检查'error'
字段
throw new Exception('File was not uploaded. ' . $this->_file['error'], $code);
我得到了7
,这是Failed to write file to disk.
,这意味着这是一个权限问题。执行phpinfo()
检查upload_tmp_dir
的设置位置并确保其可写。
就我而言,/tmp
目录中的文件空间不足。
答案 1 :(得分:1)
你的报告没有在Magento的源代码中显示为字符串的确切异常/错误消息,所以我不是100%肯定我指的是你在正确的方向。
也就是说,magento中的大多数上传都是由save
类的实例化对象上的Varien_File_Uploader
方法处理的。
File: lib/Varien/File/Uploader.php
public function save($destinationFolder, $newFileName=null)
{
$this->_validateFile();
if( $this->_allowCreateFolders ) {
$this->_createDestinationFolder($destinationFolder);
}
if( !is_writable($destinationFolder) ) {
throw new Exception('Destination folder is not writable or does not exists.');
}
$result = false;
$destFile = $destinationFolder;
$fileName = ( isset($newFileName) ) ? $newFileName : self::getCorrectFileName($this->_file['name']);
if( $this->_enableFilesDispersion ) {
$fileName = $this->correctFileNameCase($fileName);
$this->setAllowCreateFolders(true);
$this->_dispretionPath = self::getDispretionPath($fileName);
$destFile.= $this->_dispretionPath;
$this->_createDestinationFolder($destFile);
}
if( $this->_allowRenameFiles ) {
$fileName = self::getNewFileName(self::_addDirSeparator($destFile).$fileName);
}
$destFile = self::_addDirSeparator($destFile) . $fileName;
$result = move_uploaded_file($this->_file['tmp_name'], $destFile);
if( $result ) {
chmod($destFile, 0777);
if ( $this->_enableFilesDispersion ) {
$fileName = str_replace(DIRECTORY_SEPARATOR, '/', self::_addDirSeparator($this->_dispretionPath)) . $fileName;
}
$this->_uploadedFileName = $fileName;
$this->_uploadedFileDir = $destinationFolder;
$result = $this->_file;
$result['path'] = $destinationFolder;
$result['file'] = $fileName;
return $result;
} else {
return $result;
}
}
将一些调试语句抛出到此函数中以查看是否
这是被调用的那个并且正在失败
找出可能返回false的原因(即不上传文件)
答案 2 :(得分:0)
我有一些问题,一段时间后添加图像,事实证明,flash图像上传器是罪魁祸首。我跟踪了它的swf文件,并将其替换为我下载的更新版本的Magento。
如果这对here's a module无效,那么您可以在不使用Flash上传器的情况下上传图片。您至少可以确保它不是闪存问题。
答案 3 :(得分:0)
在我的情况下,uploader.swf甚至没有联系服务器并返回上传I / O错误或SSL错误。
我尝试使用Charles Proxy并且“它有效”!!即使用代理时,uploader.swf现在可以正常工作。没有代理就没有。
在我看来,问题完全在SWF上传器中,而不是在服务器上。
答案 4 :(得分:0)
验证您的vhost包含:
php_admin_value home_dir xxxxxxxxxxxxxx
因此upload_tmp_dir
必须包含在此根目录中,否则magento
函数无法捕获tmp_file
例如:你的配置vhost包括home_dir / home / someone
和 php.ini 在/ tmp
中写入上传文件 /tmp
不在dir home_dir
中并构造类函数使用file_exists()
php cant read / tmp /
你必须创建/ home / someone / tmp
并包含在vhost
配置
php_admin_value
upload_tmp_dir
/home/someone/tmp
apache2 reload
喜
答案 5 :(得分:0)
if (isset($_FILES['cv']['name']) && $_FILES['cv']['name'] != '') {
try {
$uploader = new Varien_File_Uploader('cv');
$uploader->setAllowedExtensions(array('doc', 'docx','pdf'));
$uploader->setAllowRenameFiles(true);
$uploader->setFilesDispersion(false);
$path = Mage::getBaseDir('media') . DS . 'jobs' . DS ;
if(!is_dir($path)){
mkdir($path, 0777, true);
}
$uploader->save($path, $_FILES['cv']['name'] );
$newFilename = $uploader->getUploadedFileName();
echo "<br />new file name is = ".$newFilename;
} catch (Exception $e) {
$error = true;
echo "<pre>";
print_r($e);
echo "</pre>";
}
}
答案 6 :(得分:0)
我也会用upload_max_filesize
检查phpinfo()
。
对我来说,它设置为2M
并且我的文件有3M
,并进行了更改,修复了我的问题,错误为File was not uploaded
答案 7 :(得分:-1)