Codeigniter/PHP 上传 PDF 文件不会覆盖服务器上的现有文件

Codeigniter/PHP upload PDF file does not overwrite existing file on server

当我上传一个新的 pdf 文件时,它会上传,但是当我尝试上传一个新的文件来替换它时,它从来没有真正做到(当我处理上传到我的 aws 实例的在线版本时,因为当我在本地工作时它确实工作正常)

在应用程序的其他上传中,我也上传 .rar 或 .zip,我可以覆盖现有文件(本地和服务器上)

代码前的有用注释:


我的表单是这样用js创建的:

(...)
    form = '<form enctype="multipart/form-data" accept-charset="utf-8" method="post" id="enunciado-form" action="'+base_url + 'UploadsC/uploadEnunciadoProjeto/' +proj+'">' +
    '<input class="form-input-file" type="file" id="file_projeto" name="file_projeto" title="Escolher enunciado" accept=".pdf">' +
    '</form>'

    $(".cd-message").html(form);
(...)

我的php函数上传表格:

public function uploadEnunciadoProjeto($project_id)
    {
        $user_id = $this->session->userdata('id');

        if($this->verify_teacher($user_id, $project_id, "projeto")){

            $path = './uploads/enunciados_files/';


            if(!is_dir($path)){
                mkdir($path, 0777, TRUE);
            } else {
                chmod($path, 0777);
                chmod("uploads/enunciados_files/" . $project_id . ".pdf", 0777);
            }

            clearstatcache();

            $upload['upload_path'] = $path;
            $upload['allowed_types'] = 'pdf';
            $upload['file_name'] = $project_id;
            $upload['max_size'] = 5048;
            $upload['overwrite'] = true;

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

            $this->upload->initialize($upload);

            if ( ! $this->upload->do_upload('file_projeto'))
            {
                $error = array('error' => $this->upload->display_errors());
                print_r($error);
            }
            else
            {
               header("Location: ".base_url()."projects/project/".$project_id);
            }
        } else {
            header("Location: ".base_url()."errors/403");
        }
    }


Mime for pdf:

'pdf'   =>  array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream', 'text/html', 'application/x-pdf'),

编辑

已添加 echo substr(sprintf('%o', fileperms("uploads/enunciados_files/" . $project_id . ".pdf")), -4); 我的 php 函数在 chmod 之前和之后以及取消链接之后得到以下结果:

在服务器上:

这证明该文件理论上正在被删除,但唯一有效的 PDF 上传是第一个,而且它永远不会改变。

我想知道这个问题是否与aws的设置配置有关。我还检查了文件夹中唯一的 .htaccess 实际上授予了访问该文件夹的权限。

删除以下代码行:

$upload['overwrite'] = true;

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

$this->upload->initialize($upload);

使用以下行:

// $upload['overwrite'] = true;

$this->load->library('upload', $upload);
$this->upload->overwrite = TRUE; // code added here
$this->upload->initialize($upload);

edit-01:

添加以下代码行进行调试:

$error = $this->upload->display_errors();

在对问题进行了大量研究之后,我们最终得出结论,这种方法不适合我们想要实现的目标,为此,我们改变了方法并开始使用来自 AWS 的 S3_Buckets 解决方案.

对于最终遇到相同问题的任何可能的查看器,我建议使用像存储桶这样的解决方案而不是我正在做的(将上传保存在服务器根目录)。

https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html