Codeigniter/PHP 上传 PDF 文件不会覆盖服务器上的现有文件
Codeigniter/PHP upload PDF file does not overwrite existing file on server
当我上传一个新的 pdf 文件时,它会上传,但是当我尝试上传一个新的文件来替换它时,它从来没有真正做到(当我处理上传到我的 aws 实例的在线版本时,因为当我在本地工作时它确实工作正常)
在应用程序的其他上传中,我也上传 .rar 或 .zip,我可以覆盖现有文件(本地和服务器上)
代码前的有用注释:
- 我尝试对我工作的文件夹进行 chmod,我尝试在上传新文件之前删除该文件(使用 unlink)并且始终将 "overwrite" 参数设置为 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");
}
}
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 之前和之后以及取消链接之后得到以下结果:
在服务器上:
chmod 之前:0644
chmod后:0777
取消链接后:0
这证明该文件理论上正在被删除,但唯一有效的 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
当我上传一个新的 pdf 文件时,它会上传,但是当我尝试上传一个新的文件来替换它时,它从来没有真正做到(当我处理上传到我的 aws 实例的在线版本时,因为当我在本地工作时它确实工作正常)
在应用程序的其他上传中,我也上传 .rar 或 .zip,我可以覆盖现有文件(本地和服务器上)
代码前的有用注释:
- 我尝试对我工作的文件夹进行 chmod,我尝试在上传新文件之前删除该文件(使用 unlink)并且始终将 "overwrite" 参数设置为 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");
}
}
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 之前和之后以及取消链接之后得到以下结果:
在服务器上:
chmod 之前:0644
chmod后:0777
取消链接后:0
这证明该文件理论上正在被删除,但唯一有效的 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