【问题标题】:Upload File - 500 Internal Server Error上传文件 - 500 内部服务器错误
【发布时间】:2017-04-21 00:54:43
【问题描述】:

我在这里直奔主题。 我正在尝试使用 jquery 和 codeigniter 上传 400mb+ zip 文件。 但是,当进度条完成时,控制台日志上显示 500 Internal Server Error 不知道是什么原因造成的。我已经在我的本地文件上尝试过一切正常。但是当我把它放到网上时,它给了我这个 500 内部服务器错误。

我的主机和本地已经有相同的设置了。

upload_max_filesize 500M

post_max_size 500M

max_execution_time 3000

这是我的代码:

HTML

<h1>Upload File</h1>
<hr />
<form method="post" name="upload_file" data-base-url="<?php echo site_url(array("main", "upload")); ?>" id="upload_file" action="<?php echo site_url(array("main", "do_upload")); ?>" enctype="multipart/form-data">
    <p>File Type: <strong>(*)All</strong></p>
    <!-- <p>File Type: <strong>doc, docx, pdf, xls, xlsx</strong> and <strong>txt</strong>.</p> -->
    <input type="file" name="myfile" class="form-control" required><br>
    <input type="submit" name="cmd_file_upload" id="cmd_file_upload" value="Upload File to Server" class="btn btn-default">
</form>
<br />

<p>File Uploaded: <a href="<?php echo base_url(); ?>uploaded_files/<?php echo $result['new_filename']; ?>" target="_blank"><?php echo $result['original_filename']; ?></a></p>
<div class="progress" style="display: none;">
    <div class="progress-bar progress-bar-success progress-bar-striped" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%">
      0% Complete (success)
    </div>
</div>

JQUERY

$("#upload_file").on("submit", function(e){
       e.preventDefault();

      $("#cmd_file_upload").attr("disabled","disabled");
      $(".progress").hide().show();
        var $this = $(this);
        var $url_transaction = $this.attr('action');
        var $base_url = $this.data('base-url');
        var formData = new FormData($this[0]);
        $.ajax({
            xhr: function() {
              var xhr = new window.XMLHttpRequest();

              xhr.upload.addEventListener("progress", function(evt) {
                if (evt.lengthComputable) {
                  var percentComplete = evt.loaded / evt.total;
                  percentComplete = parseInt(percentComplete * 100);
                  console.log(percentComplete);
                  $(".progress-bar").attr('style','width:'+percentComplete+'%');
                  $(".progress-bar").html(percentComplete+'%');
                  if (percentComplete === 100) {
                    $(".progress-bar").html(percentComplete+'% Complete (Success)');
                  }

                }
              }, false);

              return xhr;
            },
            beforeSend:function(){
              $(".progress-bar").attr('style','width:0%');
              $(".progress-bar").html();
            },
            url: $url_transaction,
            type: "POST",
            data: formData,
            contentType: false,
            processData: false,
            // dataType: "json",
            success: function(result) {
              console.log(result);

              setTimeout(function(){
               if(result == 0){
                  window.location.href = $base_url;
                }else{
                  window.location.href = $base_url+"/"+result;
                }
              }, 500);

            }
        });
      });

PHP 代码

public function do_upload(){

    $filename = "file_".md5(date('Y-m-d H:i:s'));
    $config['file_name']        = $filename; 
    $config['upload_path']          = './uploaded_files';
    $config['allowed_types']        = '*';
    // $config['allowed_types']        = 'doc|docx|pdf|xls|xlsx|txt';
    $config['max_size']             = 500000;

    $this->load->library('upload', $config);

    if ( ! $this->upload->do_upload('myfile'))
    {
            $error = array('error' => $this->upload->display_errors('<span>','</span>'));
            $err = array("status_id" => "0", "message" => $error['error']);
            $_SESSION['type'] = "warning";
            $_SESSION['message'] = $error['error'];
            echo 0;
    }
    else
    {   
            $data = array('upload_data' => $this->upload->data());
            $prev_filename=$data['upload_data']['client_name'];
            $file_ext = $this->upload->data("file_ext");
            $new_filename = $filename.$file_ext;

            $result = $this->main_m->insert_data('uploaded_file', array('original_filename' => $prev_filename, 'new_filename' => $new_filename));

            $_SESSION['type'] = "success";
            $_SESSION['message'] = "File's Successfully Uploaded!";
            echo $result;

    }
}

提前致谢。

【问题讨论】:

  • 你试过htaccess: php_value upload_max_filesize 500M 吗?
  • 嗨@Vickel...是的,这个设置已经在我服务器的php配置中了...
  • 检查你的系统日志和php错误日志
  • 配置中的 php max_file_size 应该是 512000; 500 x 1024 = 512000,而不是 500000(1kb 是 1024b)

标签: php jquery ajax codeigniter


【解决方案1】:

您首先应该检查的是上传到文件夹的权限如果它没有读/写访问权限(例如 775),那么您将收到 500 错误。

如果这最初不起作用,我建议您清除浏览器 cookie 和缓存,重新加载并重试。您仍然应该纠正 500000/512000k 错误,但是,这是一个容易(并且经常犯)的错误。在这种情况下,您将 500 * 1024(kb in a mb)乘以 1024(b in a kb)得到 524,288,000 (b)

确保您的 post_max_size 大于您的 upload_file_size 并且您的 memory_limit 大于 post_max_size(默认内存限制为 128MB)

希望这会有所帮助。

【讨论】:

  • 嗨,rachel,文件夹权限我确定没问题,因为我可以上传大约 38mb 的文件。我也尝试清除缓存和 cookie,但问题仍然存在。顺便问一下,$config['max_size'] 等于 50000 是什么意思?有什么区别?
  • 相差12000 b!您计算的值不正确。一千字节有 1024 个字节,而不是 1000。所以你应该将 x 乘以 1024,在本例中为 500 x 1024,以获得最大文件大小
  • 我明白了,应该是512000吧?这也会导致 500 内部服务器错误吗?
  • 没用!如果您目前可以上传的最大值为 38 mb,则听起来最大值被错误地配置为 40000。绝对值得一看!
  • 酷.. 祝你好运
【解决方案2】:

我假设您正在执行 AJAX 请求。如果是这样,并且如果您使用的是 Chrome,请不要检查控制台,而是检查网络选项卡。在那里,它应该向您显示最后一次发出的请求,包括标头、响应、输出等等。检查那里并告诉我们您首先看到的内容。这才是调试 AJAX 的正确方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 2015-10-11
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    相关资源
    最近更新 更多