【问题标题】:I can upload files on remote server, not locally on XAMPP我可以在远程服务器上上传文件,而不是在 XAMPP 本地
【发布时间】:2016-08-12 04:54:32
【问题描述】:

我使用这个脚本来上传图像文件。它应该允许上传 jpeg、jpg 和 png 文件。

一切都可以在远程服务器上运行,但我无法在 XAMPP 服务器上本地上传。我尝试了此线程Why would $_FILES be empty when uploading files to PHP? 中提到的所有技巧,但没有人奏效。

感谢您的帮助

表格:

<form class="form-horizontal" action="potwierdz.php" method="POST" enctype="multipart/form-data">
    <fieldset>

        <!-- Form Name -->
        <legend>Dodawanie produktu</legend>

        <!-- Text input-->
        <div class="form-group">
          <label class="col-md-4 control-label" for="produkt_nazwa">Nazwa</label>  
          <div class="col-md-4">
              <input id="produkt_nazwa" name="produkt_nazwa" class="form-control input-md" required="" type="text">
              <span class="help-block">Podaj nazwę produktu</span>  
          </div>
        </div>

        <!-- Text input-->
        <div class="form-group">
          <label class="col-md-4 control-label" for="producent_nazwa">Nazwa producenta</label>  
          <div class="col-md-4">
              <input id="producent_nazwa" name="producent_nazwa" class="form-control input-md" required="" type="text">
              <span class="help-block">Podaj nazwę producenta produktu</span>  
          </div>
        </div>

        <!-- Textarea -->
        <div class="form-group">
          <label class="col-md-4 control-label" for="producent_adres">Adres producenta</label>
          <div class="col-md-4">                     
            <textarea class="form-control" id="producent_adres" name="producent_adres" required=""></textarea>
          </div>
        </div>

        <!-- Select Basic -->
        <div class="form-group">
          <label class="col-md-4 control-label" for="produkt_kategoria_nazwa">Kategoria</label>
          <div class="col-md-4">
            <select id="produkt_kategoria_nazwa" name="produkt_kategoria_nazwa" class="form-control">
                <option> </option>
            </select>
          </div>
        </div>

        <!-- File Button --> 
        <div class="form-group">
          <label class="col-md-4 control-label" for="obraz">Zdjęcie</label>
          <div class="col-md-4">
            <input id="obraz" name="obraz" class="input-file" type="file">
          </div>
        </div>

        <!-- Button -->
        <div class="form-group">
          <label class="col-md-4 control-label" for="wyslij"></label>
          <div class="col-md-4">
            <button id="wyslij" name="wyslij" class="btn btn-primary">Dodaj</button>
          </div>
        </div>

    </fieldset>
</form>

这是脚本:

<?php

    $errors= array();
      $file_name = $_FILES['obraz']['name'];
      $file_size =$_FILES['obraz']['size'];
      $file_tmp =$_FILES['obraz']['tmp_name'];
      $file_type=$_FILES['obraz']['type'];
      $file_ext=strtolower(end(explode('.',$_FILES['obraz']['name'])));

      $expensions= array("jpeg","jpg","png");

      if(in_array($file_ext,$expensions)=== false){
         $errors[]="extension not allowed, please choose a JPEG or PNG file.";
      }

      if(empty($errors)==true){
         move_uploaded_file($file_tmp,"obrazki/".$file_name);
         echo "Success";
      }else{
         print_r($errors);
      }

?>

它返回“扩展名不允许,请选择 JPEG 或 PNG 文件。

它也在打印 注意:未定义索引:obraz 每当我使用$_FILES['obraz']['...'] 变量时。

【问题讨论】:

  • echo $file_ext;error_reporting(E_ALL); ini_set('display_errors', '1');
  • 您是否检查过$file_ext 的值,是否会报告错误以防出现任何其他警告/错误?
  • 当您分配 $file_name$file_type 等变量时,我会使用 if (!isset($_FILES['obraz']['name'])) { throw new \Exception('Missing file name)"; } 之类的东西进行验证
  • 你使用的是什么版本的 PHP?
  • strtolower(end(explode('.',$_FILES['obraz']['name']))) 生成错误Strict standards: Only variables should be passed by referenceend() 导致错误。 PHP5.6 & PHP5.5 & PHP 5.4 中以及 PHP7.0.5 中的通知

标签: php file xampp uploading


【解决方案1】:

当您分配 $file_name$file_type 等变量时,我会进行验证。

验证示例:

if (!isset($_FILES['obraz']['name'])) { 
  throw new \Exception('Missing file name)"; 
}

另外,我会使用array_pop() 而不是end。这只是简单地为您提供爆炸后数组中的最后一个元素。

那,我会从你的 $file_ext 变量中删除任何潜在的空格,因为空格可能是一个潜在的问题(甚至可能导致你的问题):

$file_pieces = explode('.',$_FILES['obraz']['name']);
$file_ext = trim(array_pop($file_pieces));

最后,在您的验证过程中,我会创建一个更具描述性的错误;一个呼应$file_ext

if (in_array($file_ext,$expensions) === false){
    $errors[] = "extension '$file_ext' not allowed, please choose a JPEG or PNG file.";
}

如果您仍然遇到问题,请执行var_dump($_FILES)print_r($_FILES) 以确保您正确地拉下文件名。如果这不起作用,请检查以确保您的环境已配置并正常工作。

【讨论】:

  • 嗨。感谢您的回复。它似乎抛出了您创建的异常。我在问问题之前检查了var_dump($_FILES),它总是返回一个空数组。
  • @Webowiec 我复制了您的代码并在我的环境中运行它,它似乎对我有用;当我var_dump($_FILES) 时,我得到了正确的信息。听起来这是一个特定于环境的问题(而不是与编程相关的问题)。
  • 是的,它是 :D 重新启动系统后它终于可以正常工作了
  • @Webowiec 太棒了!我应该永远记得包括“您是否将其关闭并重新打开?”作为我的回应的一部分。如果它对您有帮助,请随意投票和/或接受此答案,或者如果您有特定的解决方法,请写下您自己的答案。
【解决方案2】:

此行在 PHP5.6 & PHP5.5 & PHP 5.4 中生成错误,在 PHP7.0.5 中生成通知

严格的标准:只能通过引用传递变量

$file_ext=strtolower(end(explode('.',$_FILES['obraz']['name'])));

替换为

$t = explode('.',$_FILES['obraz']['name']);
$file_ext = strtolower($t[1]);

或者如果您使用的是 PHP7,那么您可以使用

$file_ext = strtolower(explode('.',$_FILES['obraz']['name'])[1]);

【讨论】:

  • $t[1] 偏移错误。 $_FILES['obraz']['name'] 不见了
  • 现在你突然可以看到错误信息了!那么在这种情况下,您需要首先检查用户是否实际发布了文件。并检查$_FILES['obraz']['error']
猜你喜欢
  • 2013-04-23
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多