php - 努力上传文件

标签 php

编辑

好的,所以我今天早上所做的一切:

我跑了这个命令:

sudo apt install php7.3-curl && \
sudo apt install php7.3-enchant && \
sudo apt install php7.3-gmp && \
sudo apt install php7.3-intl && \
sudo apt install php7.3-mbstring && \
sudo apt install php7.3-opcache && \
sudo apt install php7.3-pspell && \
sudo apt install php7.3-snmp && \
sudo apt install php7.3-sybase && \
sudo apt install php7.3-xmlrpc && \
sudo apt install php7.3-bcmath && \
sudo apt install php7.3-cli && \
sudo apt install php7.3-dba && \
sudo apt install php7.3-fpm && \
sudo apt install php7.3-imap && \
sudo apt install php7.3-json && \
sudo apt install php7.3-mysql && \
sudo apt install php7.3-pgsql && \
sudo apt install php7.3-readline && \
sudo apt install php7.3-soap && \
sudo apt install php7.3-tidy && \
sudo apt install php7.3-xsl && \
sudo apt install php7.3-bz2 && \
sudo apt install php7.3-common && \
sudo apt install php7.3-dev && \
sudo apt install php7.3-gd && \
sudo apt install php7.3-interbase && \
sudo apt install php7.3-ldap && \
sudo apt install php7.3-odbc && \
sudo apt install php7.3-phpdbg && \
sudo apt install php7.3-recode && \
sudo apt install php7.3-sqlite3 && \
sudo apt install php7.3-xml && \
sudo apt install php7.3-zip

然后修改我的 php.ini 以注释掉我制作的自定义集 tmp_dir's。然后重新启动我的服务器和vollah!它现在可以顺利运行。

所以我的猜测是我在某处遗漏了一个模块,如果我不得不猜测的话,-common也许?不确定,从来没有真正研究过哪个模块做了什么(可能应该避免将来出现这些问题)。

我会去做一些研究,一旦我缩小了修复它的模块的范围,我就会给出答案。

编辑 2

我相当有信心我已经缩小了负责解决我的问题的模块。我好像没有 php7.3-curl安装。这是模块的描述,取自文档:

PHP supports libcurl, a library created by Daniel Stenberg, that allows you to connect and communicate to many different types of servers with many different types of protocols. libcurl currently supports the http, https, ftp, gopher, telnet, dict, file, and ldap protocols. libcurl also supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading (this can also be done with PHP's ftp extension), HTTP form based upload, proxies, cookies, and user+password authentication.



其中,是file (在支持的协议(protocol)列表下)。

但是,卸载此模块并重新启动我的网络服务器并没有改变,它仍然成功。

我想知道在后台是否发生了一些我无法弄清楚的奇怪的缓存事情。

原帖

我有一个上传图像并将一些数据插入数据库的功能。它由 AJAX 事件触发并且一切正常,直到它尝试上传图像。

这是我的(简化的)表单 HTML:
<form method="post"
      class="form-horizontal"
      id="add-dealers-form"
      enctype="multipart/form-data">
    <input type="file" accept="image/*" name="img" id="img" />
</form>

<button type="button" class="btn btn-success" id="submit-add-model-btn">
    <span>Update Model</span>
</button>

(相关的)AJAX:
$('#submit-add-model-btn').click(function()
{
    let form = document.getElementById('add-dealers-form'),
        formData = new FormData(form);

    $.ajax({
        type: 'post',
        url: '/wp-content/plugins/my-plugin/app/scripts/admin/add-model.php',
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        success: function(res) {console.log(res); alert(res)},
        error: function(res)
        {
            alert('Something went wrong. Please try again.');
            console.log(res)
        }
    })
})

(相关)PHP:
if (!$img['error']) {
    if (move_uploaded_file($tmp, $_SERVER['DOCUMENT_ROOT']. '/wp-content/plugins/my-plugin/images/models/'. $name)) {
        $wpdb->query($wpdb->prepare(
            $sql,
            array($_POST['name'], $_POST['sku'], $_POST['type'], $name)
        ));
    } else {
        $response['110'] = 'There was a problem with the upload. Please try again.';
    }
} else {
    $response['110'] = 'There was a problem with the upload. Please try again.';
}

我也尝试过:
if ($img['error'] == 0)

我也试过使用 copy()反而。

添加 print_r()在条件显示 $_FILES 之前和 $_POST被填充。所以那里没有问题。

这是问题(我的文件夹权限):
drwxrwxrwx  3 www-data www-data 4096 May 20 13:56 images/

然后在里面建模:
drwxrwxrwx 2 www-data www-data 4096 May 20 13:56 models/

所以它具有完全不安全的、广泛开放的权限,但它不起作用。我检查了我的本地错误日志,但什么也没有。我已经在我的脚本中启用了错误报告 - 仍然没有。

我的网络选项卡显示请求返回 200 状态。它还显示了我设置的错误消息。

我还尝试删除 AJAX 步骤并直接进入 PHP 脚本 - 再次,什么都没有。

我浏览了一些 SO 帖子并尝试了替代解决方案,但没有成功。我不确定我的脚本有什么问题,它有 enctype ,它具有图像发送所需的 ajax 设置,并且具有完全权限,我错过了什么?

我要上传的文件是 70kb(所以不可能是大小问题)

我已经用我知道的其他代码进行了测试(在生产服务器上工作) - 所以它绝对是服务器级的。让我知道您认为有用的内容(配置方面),我将添加到 Q 中。

服务器端设置

可能有用的 .ini 设置:
memory_limit = -1
upload_max_size = 2M
post_max_size = 8M
upload_tmp_dir = /tmp/php
sys_temp_dir = /tmp/php

Apache
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2019-04-03T13:22:37


Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php7_module (shared)
 proxy_module (shared)
 proxy_fcgi_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 status_module (shared)

PHP
PHP 7.3.5-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: May  3 2019 10:00:24) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.5, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.5-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
/tmp 的权限
drwxrwxrwx  22 root root      12288 May 20 17:29 tmp/
/tmp/php 的权限
drwxrwxr-x  2 www-data www-data    4096 May 20 16:28 php/

最佳答案

这个 PHP/HTML 代码对我有用。随意修改。希望对您有所帮助: :)

<!DOCTYPE html><html><body><style>
*{font-family:corbel;padding:0.8em;margin-left:2em;background:#9dc;}
</style>
<form action="files.php" method="post" enctype="multipart/form-data">
  Files (not videos though):
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="Upload Image" name="submit">
</form></body></html>

<?php
$target_dir = "";
$t_f = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$stat = 1;
$f_Type = strtolower(pathinfo($t_f,PATHINFO_EXTENSION));

/* Check if file already exists
if(file_exists($t_f)) {echo "Sorry, file already exists.";$stat = 0;}
*/
//Debugging
echo"<p style='color:#777'>";
print_r($_FILES["fileToUpload"]);
echo'</p>';

// Check file size. 0.5MB Max.
if($_FILES["fileToUpload"]["size"] > 500000) {
  echo "Sorry, your file is too large.";
  $stat = 0;}

/* Allow certain file formats
if($f_Type != "jpg" && $f_Type != "png" && $f_Type != "jpeg"
&& $f_Type != "gif" ) {
  echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
  $stat = 0;}
 Check if $stat is set to 0 by an error*/
if($stat == 0) {
  echo "Sorry, your file was not uploaded.";}
// if everything is ok, try to upload file
else {
  if(move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $t_f)) {
    echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";}
else { echo "Welcome to Aera23's uploader. This message should disappear if the file is uploaded";}}
?>

?>

关于php - 努力上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56223655/

相关文章:

php - 获取表 A 中几个 SQL 行(a_ID 和 avg_data)的平均值,其中在表 B 中(a_ID 按 b_ID 分组)

php - 如何使用事务查询 mysql 在 PHP 中将其保留在几个页面上?

javascript - Symfony Assetic-URL中的part_1

php - 动态创建表单、表格和模型?

php - Laravel4 复制/复制表行

PHP 条件赋值

php - 一段时间后 blpop 停止处理队列

javascript - Laravel 中的 SweetAlert 实现

php - 以不同的间隔选择多行

php - 无法允许元素(img : 'src' ) with symfony html-sanitizer (symfony6. 3 php 8.2)