【问题标题】:Image upload with ajax and php is failing (no error log)使用 ajax 和 php 上传图片失败(没有错误日志)
【发布时间】:2014-01-03 22:55:50
【问题描述】:

我用来上传图片的以下代码由于某种原因失败了... 这是 HTML

<form id="image_upload" enctype="multipart/form-data" action="uploadImage.php" method="post" name="prof_picture">
    <input id="image1" style="display:none;" name="image" accept="image/jpeg" type="file">
    <input id="image2" value="Submit" type="submit" style="display:none;">
</form>

PHP (uploadImage.php)

include('../sqlconnection.php');
define ("MAX_SIZE","1000");

function getExtension($str)
{
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}

$valid_formats = array("jpg", "png", "gif", "bmp","jpeg");
if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") 
{
    $uploaddir = "profile/uploads"; //Image upload directory

    $filename = stripslashes($_FILES['image']['name'][0]);

    echo $filename;

    $size=filesize($_FILES['image']['tmp_name'][0]);

    echo $filename;
    //Convert extension into a lower case format
    $ext = getExtension($filename);
    $ext = strtolower($ext);
    //File extension check
    if(in_array($ext,$valid_formats))
    {
    //File size check
    if ($size < (MAX_SIZE*1024))
    { 
    $image_name=time().$filename; 
    echo "<img src='".$uploaddir.$image_name."' class='imgList'>"; 
    $newname=$uploaddir.$image_name; 
    //Moving file to uploads folder
    if (move_uploaded_file($_FILES['image']['tmp_name'][0], $newname)) 
    { 
    $time=time(); 
    //Insert upload image files names into user_uploads table
    mysql_query("UPDATE table SET image='$image_name' WHERE id='$user_id'");
    }
    else 
    { 
    echo '<span class="imgList">failed</span>'; } 
    }

    else 
    { 
    echo '<span class="imgList">failed</span>'; 
    } 

    } 

    else 
    { 
    echo '<span class="imgList">failed</span>'; 
    } 

} 

JS

$('#image1').on('change', function() {
        $("#image").attr('src',"profile/loading.gif");

        $("#image_upload").ajaxForm({
                        target: '#image'
        }).submit();
});

我所知道的肯定

php 脚本正在正确实现,因为我故意使部分代码失败并获得有关内部 php 错误的错误消息。

查询正在正确完成(或至少通过其语法)。

与#image相关的javascript函数也正在运行。

我只想上传用户选择的一张图片(即使他选择了 100 个其他项目)。但正如我所说,我什至没有在日志上收到错误消息......关于这个有什么想法吗?非常感谢!


编辑

我稍微改了一下代码

$ext = strtolower($ext);
    if(in_array($ext,$valid_formats)){
        if ($size < (MAX_SIZE*1024)){ 
            $image_name=time().$user_id."--pfi-".$filename;
            $newname=$uploaddir.$image_name;
                if (move_uploaded_file($_FILES['image']['tmp_name'], $newname)){
                    mysql_query("UPDATE table SET image='$image_name' WHERE id='$user_id'");
                }else echo '<span class="imgList">This message appears </span>'; 
        }else echo '<span class="imgList">You have exceeded the size limit!</span>';
    }else echo '<span class="imgList">Unknown extension!</span>';

由于某种原因,它现在停在if(move_uploaded_file($_FILES['image']['tmp_name'], $newname))。我已经对此进行了 var_dump,它确实是“错误的”,但我无法理解为什么。这里是 var_dump($_FILES):

array(1) { ["image"]=> array(5) { ["name"]=> string(21) "060424_hubble_big.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpZYaDkm" ["error"]=> int(0) ["size"]=> int(35641) } }

编辑 2

警告: move_uploaded_file(profile/uploads/1388794617.png): 无法打开流:中没有这样的文件或目录 profile/uploadProfilePicture.php 在第 37 行 警告:move_uploaded_file():无法将“/tmp/phppFfoL4”移动到 '配置文件/上传/1388794617.png' 在 profile/uploadProfilePicture.php 第 37 行

我应该如何指定 $uploaddir 甚至 $newname?

【问题讨论】:

  • 试试$uploaddir = "profile/uploads/";
  • 如果 isset($_POST) 指出任何表单提交。考虑到这是指向此脚本的唯一形式,所以不会有任何其他问题(当然这并不像应有的那样安全,感谢您指出这一点),这不是什么大问题。 && 你对此也是正确的,但我猜想并且当时我想到了。
  • 最后添加/,正如保罗所说。很可能是问题所在。我以前见过这种情况,它不会显示错误消息,但也没有上传任何内容。
  • @Paul 刚刚尝试过,但实际上并非如此。这可能是尝试调试时的早期缺陷。
  • 很抱歉,我删除了我的评论,认为它没有任何区别。不过不客气。

标签: javascript php jquery ajax


【解决方案1】:

编辑

这是我用的。注意注释掉的条件语句。

<?php

// include('../sqlconnection.php');
 define ("MAX_SIZE","1000000000");


function getExtension($str)
{
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}

$valid_formats = array("jpg", "png", "gif", "bmp","jpeg");
// if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") 
// {
    $uploaddir = "profile/uploads/"; //Image upload directory

    $filename = stripslashes($_FILES['image']['name']);

    echo $filename;

    $size=filesize($_FILES['image']['tmp_name']);

    echo $filename;
    //Convert extension into a lower case format
    $ext = getExtension($filename);
    $ext = strtolower($ext);
    //File extension check
    if(in_array($ext,$valid_formats))
    {
    //File size check
    if ($size < (MAX_SIZE*1024))
    { 
    $image_name=time().$filename; 
    echo "<img src='".$uploaddir.$image_name."' class='imgList'>"; 
    $newname=$uploaddir.$image_name; 
    //Moving file to uploads folder
    if (move_uploaded_file($_FILES['image']['tmp_name'], $newname)) 
    { 
    $time=time(); 
    //Insert upload image files names into user_uploads table
//    mysql_query("UPDATE table SET image='$image_name' WHERE id='$user_id'");
    }
    else 
    { 
    echo '<span class="imgList">failed</span>'; } 
    }

    else 
    { 
    echo '<span class="imgList">failed</span>'; 
    } 

    } 

    else 
    { 
    echo '<span class="imgList">failed</span>'; 
    } 

// }

原答案

好的,我发现了问题。删除 PHP 中的所有 [0],它现在可以工作了。这些用于数组,并且由于您仅将其用于单个文件上传,这就是它失败的原因。

旁注:您可能希望在$uploaddir = "profile/uploads"; 的末尾添加一个/,如$uploaddir = "profile/uploads/"; 中所示

以下没有[0],并已将其作为没有JS的纯PHP进行测试。

include('../sqlconnection.php');
define ("MAX_SIZE","1000");

function getExtension($str)
{
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}

$valid_formats = array("jpg", "png", "gif", "bmp","jpeg");
if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") 
{
    $uploaddir = "profile/uploads"; //Image upload directory

    $filename = stripslashes($_FILES['image']['name']);

    echo $filename;

    $size=filesize($_FILES['image']['tmp_name']);

    echo $filename;
    //Convert extension into a lower case format
    $ext = getExtension($filename);
    $ext = strtolower($ext);
    //File extension check
    if(in_array($ext,$valid_formats))
    {
    //File size check
    if ($size < (MAX_SIZE*1024))
    { 
    $image_name=time().$filename; 
    echo "<img src='".$uploaddir.$image_name."' class='imgList'>"; 
    $newname=$uploaddir.$image_name; 
    //Moving file to uploads folder
    if (move_uploaded_file($_FILES['image']['tmp_name'], $newname)) 
    { 
    $time=time(); 
    //Insert upload image files names into user_uploads table
    mysql_query("UPDATE table SET image='$image_name' WHERE id='$user_id'");
    }
    else 
    { 
    echo '<span class="imgList">failed</span>'; } 
    }

    else 
    { 
    echo '<span class="imgList">failed</span>'; 
    } 

    } 

    else 
    { 
    echo '<span class="imgList">failed</span>'; 
    } 

} 

【讨论】:

  • 就是这样!!但不幸的是,它无论如何都不会上传。请检查编辑,我会给你正确的答案(确实如此!)
  • 我注释掉了用于测试它的数据库内容,所以这就是可能有问题的区域。 @user111671 如果我记得的话,我还注释掉了 if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST")。我将在我的问题中添加我使用的确切内容,作为编辑。
  • 它真的在 if 中运行吗?如果它在这个问题不应该存在之前通过每一个 if...它甚至没有到达查询所以它只是奇怪不在 if move_uploaded_files 上工作
  • 是的,我的编辑与我使用的完全一样,我没有偏离它。我只注释掉了我不需要的(DB)以及我认为会麻烦的;条件语句if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST")@user111671
  • 我取出的另一件事是表格中的style="display:none;"。我看不到这些按钮,因为您可能正在以一种特殊的方式使用它们。 @user111671
猜你喜欢
  • 1970-01-01
  • 2016-04-11
  • 2015-07-24
  • 2014-10-25
  • 2014-07-22
  • 1970-01-01
  • 2010-12-06
  • 2014-12-02
  • 2016-08-10
相关资源
最近更新 更多