【问题标题】:Codeigniter/PHP upload PDF file does not overwrite existing file on serverCodeigniter/PHP 上传 PDF 文件不会覆盖服务器上的现有文件
【发布时间】:2020-09-28 02:03:10
【问题描述】:

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

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

代码前有用的注释:

  • 我曾尝试对我正在工作的文件夹进行 chmod,我曾尝试在上传新文件之前删除该文件(使用取消链接),并且始终将“覆盖”参数设置为 true。

我的表单是这样用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");
        }
    }


pdf 的 Mime:

'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 和取消链接之后,并有以下结果:

在服务器上:

  • chmod 之前:0644

  • chmod: 0777 之后

  • 取消链接后:0

这证明该文件理论上已被删除,但唯一可以上传的 PDF 文件是第一个,并且它永远不会改变。

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

【问题讨论】:

  • 初步的想法,可以缓存吗?
  • 用相同的文件名覆盖文件
  • 我尝试在上传前使用“clearstatcache();”清除缓存,不确定这是否是最好的方法。
  • 它是相同的文件名,$project_id,因为我正在上传与同一个项目相关的不同文件(例如:601)它总是将文件命名为“601.pdf”

标签: php amazon-web-services codeigniter file-upload upload


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    删除以下代码行:

    $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();
    

    【讨论】:

    • 在 localhost 中它就像我的版本一样工作,但在我的 aws 实例上它不会覆盖第一次上传
    • 我添加了该行(上传失败时我已经拥有它,但之前也添加了它)。正如预期的那样没有错误,它回显一个空字符串,这意味着理论上上传成功,但它不会覆盖服务器上传文件夹中现有的pdf文件。我想知道这是否是权限问题,但我也在 chmod 之前、取消链接之前和取消链接之后的文件路径中使用 fileperms($path),并且权限正在更改,并且据说文件已被删除,但实际上它每次我上传不同的时候都会呆在那里
    • $this-&gt;upload-&gt;display_errors()放在if语句之外
    猜你喜欢
    • 2014-08-29
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2022-06-21
    • 1970-01-01
    相关资源
    最近更新 更多