真正的Ajax上传器错误:无法写入文件

时间:2017-06-06 06:10:45

标签: php jquery ajax file-permissions ajaxuploader

我正在构建一个需要能够上传大型.wav文件的网站。我认为上传这些文件的最佳方式是通过jQuery插件将数据块化到服务器。我选择Real Ajax Uploader来执行此操作。

我将以下内容放在一起,它适用于较小的文件:

$('.demo').ajaxupload({
    url : '/upload.php',
    remotePath: '/remote/path/',
    maxFiles: 1,
    maxFileSize: '250M',
 });

当我有一个涉及“分块”的较大文件时,会出现问题。由于某种原因,脚本不断给我这个错误:

Cannot write on file.

我已经将它追溯到upload.php文件中的这个位置:

...
//start of the file upload, first chunk
if ($currByte == 0) {
    $tempFile           = tempnam($this->tempPath, 'axupload');
    $this->tempFileName = basename($tempFile);
}

// some rare times (on very very fast connection), file_put_contents will be unable to write on the file,
// so we try until it writes for a max of 5 times
$try = 5;
while (file_put_contents($tempFile, $fileChunk, FILE_APPEND) === false && $try > 0) {
   usleep(50);
   $try--;
}

//if the above fails then user cannot write file due to permission or other problems
if (!$try) {
   $this->message(-1, 'Cannot write on file.');
}
...

我认为这意味着$tempFile不可写,所以我添加了这一点:

...
//start of the file upload, first chunk
if ($currByte == 0) {
    $tempFile           = tempnam($this->tempPath, 'axupload');
    $this->tempFileName = basename($tempFile);
 }

 chmod($tempFile, 0755);
 ...

我再次尝试了,我仍然遇到了问题,所以我将/ tmp的权限更改为755,可能就是这样。什么都没有。

我可以尝试只更改/ tmp目录的位置并拥有更可写的环境,但是如果有一个更简单的解决方案,我宁愿选择它。

谢谢。

1 个答案:

答案 0 :(得分:0)

首先在目录中上传一个小文件,然后检查它是否成功上传。如果成功,则搜索php.ini设置文件并检查以下内容:

php_value upload_max_filesize 10M
php_value post_max_size 10M
php_value max_input_time 300
php_value max_execution_time 300

更新以上所有设置以满足您的要求,然后重新启动服务器,然后重试。