无法上传文件,看不到文件

时间:2018-01-19 06:53:19

标签: php

我需要将文件上传到文件夹,然后通过phpmailer发送。我上传有问题。它没有看到$_FILES["filename"]["tmp_name"]var_dump上的NULL显示C:\fakepath。还显示了dir <form method="post" action="example.php" name="example" id="example" enctype="multipart/form-data"> <input type="file" class="form-control" name="file_name" id="file_name" required> <input type="submit" value="Submit" id="submit_btn" name="submit_btn" /> </form> ,我读到它是安全方面。如何避免此问题并上传文件?

$uploads_dir = '/uploads'; 

$tmp_name = $_FILES["file_name"]["tmp_name"]; 
$uploadedFile = $uploads_dir ."/". basename($_FILES['file_name']['name']."test");

function isAllowedFile($filename)
{
    $allowed = array(".pdf", ".png", ".jpg", ".jpeg");
    $extension = strtolower(substr($filename, strripos($filename, '.')));
    if(in_array($extension, $allowed)){return TRUE;}else{return FALSE;}
}

if(isset($_FILES["file_name"]) && $_FILES["file_name"]["error"] == 0 && isAllowedFile($_FILES["file_name"]["name"]))
{

  if(move_uploaded_file($_FILES['file_name']['tmp_name'], $uploadedFile))  { 
  //do smth 
  }
  else { 
  var_dump($_POST);
  }
}

使用example.php

$('#example').submit(function() {
  var action = $(this).attr('action');
  $("#message").show(400, function() {
    $('#message').hide();

    $('#submit')
      .after('<img src="images/ajax-loader.gif" class="loader" />')
      .attr('disabled', 'disabled');

    $.post(action, {
        surname: $('#surname').val(),
        allnames: $('#allnames').val(),
        dateofbirth: $('#dateofbirth').val(),
        country: $('#country').val(),
        birthplace: $('#birthplace').val(),
        sexselect: $('#sexselect').val(),
        telefon: $('#telefon').val(),
        mobile: $('#mobile').val(),
        addressperm: $('#addressperm').val(),
        email: $('#email').val(),
        passnumb: $('#passnumb').val(),
        paspisuedate: $('#paspisuedate').val(),
        paspexpdate: $('#paspexpdate').val(),
        file_name: $('#file_name').val(),
        residadress: $('#residadress').val(),
        visitkarab: $('#visitkarab').val()
      },
      function(data) {
        document.getElementById('message').innerHTML = data;
        $('#message').slideDown('slow');
        $('#example img.loader').fadeOut('slow', function() {
          $(this).remove()
        });
        $('#submit').removeAttr('disabled');
        //if(data.match('success') != null) $('#contactformvisa').slideUp(3000);

      });
  });
  return false;
});

Map

2 个答案:

答案 0 :(得分:0)

您必须将完整地址放在$uploads_dir变量中。看起来你在Windows系统上尝试这个,所以不会成为/uploads目录。您应该将地址设置为C:/directory。确保您已为该目录上的PHP用户启用了读/写/删除权限。另请注意,您正在填充$uploadedFile var,如下所示:

$uploadedFile = $uploads_dir . basename($_FILES['file_name']['name']."test");

像这样:

$uploadedFile = $uploads_dir . "/" . basename($_FILES['file_name']['name']."test");

文件夹名称和文件名之间应该有斜杠。

编辑:问题是您尝试使用jQuery通过使用$('#file_name').val()获取文件路径来提交表单。根据HTML 5规范,您无法使用JS获取文件的位置。 this blog中提到了它,它解释了:

According to the specifications of HTML5, a file upload control should not reveal the real local path to the file you have selected, if you manipulate its value string with JavaScript. Instead, the string that is returned by the script, which handles the file information is C:\fakepath.

This requirement is already implemented in Internet Explorer 8 - the real path to the file will be shown only if the page that contains the control is added to the trusted sites collection of the browser.

因此,要使用ajax提交表单,您可以使用this link中提到的FormData对象。

<script type="text/javascript">
    $(document).ready(function(e) {
        $("#example").on('submit', (function(e) {
            e.preventDefault();
            $.ajax({
                url: "example.php",
                type: "POST",
                data: new FormData(this),
                contentType: false,
                cache: false,
                processData: false,
                success: function(data) {
                    $("#targetLayer").html(data);
                },
                error: function(jqHXR, status, error) {
                    console.log(error);
                }
            });
        }));
    });
</script>

答案 1 :(得分:0)

对我来说,$uploadedFile使用basename($_FILES['file_name']['name']."test")声明存在问题〜这会导致文件在保存时没有扩展名。

使用isAllowedFile获取文件扩展名而不是使用pathinfo

的复杂用法,可以简化substr {/ 1}}

您在网络服务器上的目录结构未知但如果您认为文档根目录是c:/wwwroot/html/public,那么您通常会将文件之外的文件上传到非公共目录,例如c:/wwwroot/html/uploads 〜所以记住使用的目录是c:/wwwroot/html/uploads/

上传表单

<!doctype html>
<html>
    <head>
        <meta charset='utf-8' />
        <title>File Upload</title>
    </head>
    <body>

        <form method='post' action='example.php' enctype='multipart/form-data'>
          <input type='file' class='form-control' name='file_name' id='file_name' required>
          <input id='bttn_sub' type='submit' value='Standard Submit' />
          <input id='bttn_ajax' type='button' value='AJAX submit' />
          <output id='fb'></output>
        </form>
        <script>
            var bttn=document.getElementById('bttn_ajax');
            bttn.onclick=function(e){
                var xhr=new XMLHttpRequest();
                var fd=new FormData( this.parentNode );
                xhr.onreadystatechange=function(){
                    if( this.status==200 && this.readyState==4 )document.getElementById('fb').innerHTML=this.response;
                }
                xhr.open( 'POST', 'example.php', true );
                xhr.send( fd );
            }.bind( bttn );
        </script>
    </body>
</html>

<强>使用example.php

<?php
    $fieldname='file_name';

    function isAllowedFile( $ext ){
        $allowed = array( 'pdf', 'png', 'jpg', 'jpeg' );
        return in_array( $ext , $allowed );
    }

    function createpath( $path=NULL, $perm=0644 ) {
        if( !file_exists( $path ) ) {
            createpath( dirname( $path ) );
            mkdir( $path, $perm, TRUE );
            clearstatcache();
        }
        return $path;
    }

    if( isset( $_FILES[ $fieldname ] ) ){

        $obj=(object)$_FILES[ $fieldname ];

        $name=$obj->name;
        $tmp=$obj->tmp_name;
        $size=$obj->size;
        $error=$obj->error;


        if( is_uploaded_file( $tmp ) && $error==UPLOAD_ERR_OK ){


            $root = $_SERVER['DOCUMENT_ROOT'];
            chdir( $root );
            chdir( '../' );

            $uploads_dir = createpath( getcwd() . '/uploads/' );


            $uploadedFile = $uploads_dir . $name;
            $ext=strtolower( pathinfo( $name, PATHINFO_EXTENSION ) );

            if( isAllowedFile( $ext ) ){

                $status = move_uploaded_file( $tmp, $uploadedFile );

                if( $status ){
                    //do smth 
                    echo "OK";
                } else {
                    var_dump($_POST);
                }
            }
        }
    }
?>

我尝试了上面的演示 - 我错过了来自$的{​​{1}}但是当它得到纠正时效果很好 - 请注意我使用了与我的电脑相关的路径uploadedFile

尝试导航到上传目录时请考虑以下事项:

c:/temp/fileuploads/

这会找到服务器根并从那里导航一个级别(如果您将文件存储在root之外),则可以使用$root = $_SERVER['DOCUMENT_ROOT']; chdir( $root ); print_r( getcwd() ); chdir( '../' ); print_r( getcwd() ); 构成目标路径的一部分

getcwd()
相关问题