【问题标题】:Uploading Photos Issue上传照片问题
【发布时间】:2011-11-05 11:48:59
【问题描述】:

我编写了一个函数,该函数从表单上传照片,在服务器上创建文件并将信息添加到数据库中,但我做噩梦试图让它完全按照我的意愿去做。

编辑

目前,如果文件类型错误并且超过 3MB,它会显示正确的错误消息,但是当我尝试上传 17MB .bmp 文件时,它会取消并注销我。在处理了预期的功能后,它似乎重新启动了我的 process.php 文件。

我很困惑,所以任何帮助将不胜感激。谢谢

    <form action="process.php" method="POST" enctype="multipart/form-data" name="formUpload">
        <label>Picture:</label>
        <input type="file" name="photo" id="photobrowser" tabindex="4">
        <span class="error"><?php echo $form->error("photo"); ?></span><br />
        <input type="hidden" name="sessionid" value="<?php echo $sessionid; ?>" />
        <input type="hidden" name="subphoto" value="1" />
        <input type="image" src="styling/images/button-add-photo.png" id="subBtn" tabindex="6" />
    </form>

进程.php

 class Process {

function Process(){ /* Class constructor */
    global $session;

    if(isset($_POST['subphoto'])){ /* User submitted an advert photo  */
        $this->procAddPhoto();
    } else if($session->logged_in){ /* No form was submitted therefor logout */
        $this->procLogout();
    } else { /* User trying to view this file */
        header("Location: /");
    }
}
function procAddPhoto(){
    global $session, $form;

    $retval = $session->addPhoto($_FILES['photo']['size'], $_FILES['photo']['type'], $_FILES['photo']['tmp_name'], $_POST['sessionid']);    

    if($retval == 0){ /* Successful */
        // do stuff
    } else if($retval == 1){ /* Errors found */
        // do stuff
    } else if($retval == 2){ /* Adding failed */
        // do stuff
    }
   } // close function procAddPhoto()
 };

 $process = new Process; /* Initialize process */

 ?>

session.php

function addPhoto($subphotoSize,$subphotoType,$subphotoTmpname,$subsessionid){
    global $database, $form;

    $maxFileSize = 3000000; // bytes (3 MB)

    /* Image error checking */
    $field = "photo";
    if($subphotoSize == 0){
        $form->setError($field, "* No file selected");
    } else {
        list($width, $height, $type, $attr) = getimagesize($subphotoTmpname);
        if($width > 4000){
            $form->setError($field, "* Max photo width is 4000 pixels.");
        } else if($subphotoSize > $maxFileSize) {
            $form->setError($field, "* Photo is above the maximum of 3 MB");
        } else if( ($subphotoType != "image/jpeg") && ($subphotoType != "image/pjpeg") && ($subphotoType != "image/png") ){
            $form->setError($field, "* $subphotoType is wrong file type");
        }
    }
    /* Errors exist, have user correct them */
    if($form->num_errors > 0){
        return 1;  //Errors with form
    } else { // Else use variables

        /* Get random string for new filename name */
        $randNum = $this->generateRandStr(10);
        $filerootpath = PHOTOS_DIR.$subsessionid."/";
        $thumbrootpath = PHOTOS_DIR.$subsessionid."/thumbs/";

        if($subphotoType == "image/png"){
            $filename = $randNum.".png";
        } else if ($subphotoType == "image/jpeg" || $subphotoType == "image/pjpeg"){
            $filename = $randNum.".jpg";
        } 
        $fullURL = $filerootpath.$filename;
        $thumbURL = $thumbrootpath.$filename;

        /* Make sure file is RGB colors */
        $getimagesize = getimagesize($subphotoTmpname); 
        if (isset($getimagesize['channels']) && $getimagesize['channels'] == 4 && $getimagesize[2] == IMAGETYPE_JPEG ) { 
            $im = @imagecreatefromjpeg($subphotoTmpname); 
            if ($im) { 
                imagejpeg($im, $image, 75); 
                imagedestroy($im); 
            } 
        }


        /* Upload files to correct folders */
        move_uploaded_file($subphotoTmpname, "$fullURL");

        /* Use session ID for the advert ID because it hasnt been made yet */
        $userSession = $this->userinfo['userid'];
        $ownerID = $this->userinfo['id'];
        if(!$database->addNewPhoto($ownerID,$fullURL,$userSession,$is_main_photo, $subsessionid, $thumbURL)){
            return 2; // Failed to add to database
        }
    }
    return 0; // Success
}

【问题讨论】:

  • "除非文件大小为几 MB,在这种情况下,它会完全注销用户"您的用户会因此而爱上您...

标签: php image upload


【解决方案1】:

只是一个想法......我猜你在这里有不止一个问题。您说过,当有人试图通过 X mb 上传文件时,它基本上会按下终止开关。你知道,大概,那个尺寸是多少?如果这样做,您能否将其与您的 php 安装的 upload_max_filesize 和 post_max_size 设置进行比较?它们都应该在 phpinfo() 中可见。我认为默认值在 2mb 左右,但我可能错了。无论哪种方式,我知道当您尝试上传超出这些设置的内容时,它基本上会吐出一点。您可能需要更改那个的 php.ini 设置。

【讨论】:

  • 我在我的 php.ini 文件中更改了这些值,脚本仍然执行相同的操作。如果您不介意再看一遍,我编辑了原始帖子。谢谢
  • 要记住两件事。首先,您在 php.ini 中将这些值更改为什么?它没有很好的记录,我可能应该在我的原始答案中提到这一点,但我有点匆忙,但 post_max_size 必须至少是 upload_max_filesize 大小的两倍,否则设置将被拒绝,默认值分别为 8MB 和 2MB用过的。我会验证您是否正确设置了这些设置,然后重新启动 php(如果您不重新启动 php 引擎,则更改永远不会生效)并查看 phpinfo() 以确保它已经完成。还有……
  • 我真的不确定我是否理解无法查看某些文件的问题。您是说文件将正确上传,但在浏览器中无法查看?还是您在浏览器中收到错误消息?如果您能准确说明该特定错误发生的时间/地点,那将有所帮助。即使只是提供指向引发此错误的图像之一的链接也会有所帮助。
  • 天啊,还有一件事你应该检查一下。如果您要更改 post_max_size,则需要检查是否为您的安装设置了 memory_limit。如果这是一个共享主机,那么他们可能确实设置了内存限制。您需要调整 memory_limit 使其大于 post_max_size。这三个设置会让你在 php.ini 中关闭。 memory_limit 必须大于 post_max_size。 post_max_size 必须至少是upload_max_filesize 大小的两倍。
【解决方案2】:

如果文件类型不正确,它会显示错误,除非文件 大小为几 MB,在这种情况下,它将完全注销用户, 几乎就像它杀死所有会话变量一样

请打开 /etc/php5/apache2/php.ini(假设您使用的是 apache2)并设置 upload_max_filesize = 5M(对于 5 兆字节的文件)并且您的 file_uploads = On。然后重新启动apache。然后再试一次。

图像无法显示,因为它包含错误。”但是当我 从服务器下载上传的图片,图片显示 很好,但不是通过 http。

您能否检查您是否有足够的权限从存储图像的目录中读取图像。 (并确保您访问的是正确的目录;尝试在浏览器地址栏中复制图像的相对路径)

让我先澄清几件事:

1.您可以上传 17 mb 的文件,但您想限制上传超过 3 mb。 2.它上传 17 mb 的文件,但从浏览器你可以看到。但是如果你从你的服务器下载windows可以正确打开吗?

你能插入:var_dump($ubphotoSize); var_dump($$maxFileSize);在 addPhot() 的开头,然后再试一次。根据您的说法,它似乎无法比较文件大小。请让我们知道我们的输出。

【讨论】:

  • 它没有显示在 phpinfo 文件中,我认为主机已对此进行了限制。所以我现在给他们发电子邮件,以了解这些值是什么。谢谢
  • 我在我自己的电脑上使用 EasyPHP,我已经将upload_max_filesize = 18M 并且仍然让我退出。我正在上传一个 17Mb 的 .bmp 文件,所以它应该说它太大或它的文件类型错误,但它还没有显示正确的错误与 4 Mb jpg 或 .bmp 文件(不允许)。
猜你喜欢
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2020-06-24
相关资源
最近更新 更多