Magento“档案未上传”

时间:2010-04-19 21:04:02

标签: php image file-upload magento

我目前正在使用magento管理界面,尝试在“管理产品”中上传图片,我在浏览文件并点击“上传文件”后收到错误“文件未上传”。我看过其他论坛,我看到的主要解决方案是确保php.ini有以下几行......

magic_quotes_gpc = off
short_open_tag = on
extension=pdo.so
extension=pdo_mysql.so

我有带ISAPI_Rewrite的Windows / IIS。是否有最大文件上传大小,我可以在某处更改。我正在从我当地的桌面上传大小~100kb的图片。帮助!

8 个答案:

答案 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;
    }
}

将一些调试语句抛出到此函数中以查看是否

  1. 这是被调用的那个并且正在失败

  2. 找出可能返回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)

  • 更改浏览器,计算机,清除本地缓存和Cookie等。
  • 检查/ media /文件夹的权限(已尝试777和755)。
  • 按照Magento root中的.htaccess文件的说明,读取并实施对GoDaddy服务器的.htaccess的更改
  • 已禁用商店视图,刷新缓存,从Magento注销,从/ var / cache /删除缓存,然后重新启用商店视图,再次清除缓存
  • 上传并调用Prototype.js的早期版本
  • 上传本地版本的jQuery,因为我读到Prototype和jQuery会发生冲突,这是建议的解决方案
  • 检查GD扩展是否安装在我服务器的PHP版本中。