【问题标题】:Php fails to open stream even with permissions, restrictions and filesize checked即使检查了权限、限制和文件大小,Php 也无法打开流
【发布时间】:2018-09-24 03:53:43
【问题描述】:

我正在尝试让 php 在服务器上保存数据。这些数据是通过 js 脚本生成的。但是,我无法让 php 创建文件。我得到的错误信息如下: 警告:file_put_contents(data/) [function.file-put-contents]: failed to open stream: Is a directory in

我已经检查了权限和 php.ini 的限制,但成功率为零。有什么想法吗?

如果我将“data/”位更改为“X”,服务器会创建一个名为 X 的空文件。这看起来很奇怪。 js脚本中使用的命令来自jsPsych。

非常感谢!

我附上代码:

function saveData(name, data){
  var xhr = new XMLHttpRequest();

  xhr.open('POST', 'write_data.php');
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.send(JSON.stringify({filename: name, filedata: data}));
};

(...)

on_finish:

function(){
  saveData('subject-'+subject_id+'.csv', jsPsych.data.get().csv() );
}

<?php

$filename = 'data/'.$_POST['filename'];
$data = $_POST['filedata'];
file_put_contents($filename, $data);

?>

【问题讨论】:

  • php 不知何故丢失了:
  • 请编辑您的帖子以添加 php
  • 谢谢,没注意到编辑按钮 :)

标签: javascript php ajax server


【解决方案1】:

我不是 Xhr 方面的专家,也不是你做这件事的风格。不过我确实知道 jQuery 和普通的 JS。

jquery方法:

var postName = 'something'; // this is found with $_POST['postName'] in PHP
var postName2 = 'somethingElse'; 
$.post("path/yourFile.php", {postName:value, postName2:value}, function(data){
            if(data == 'success'){
                // complete success 
            } else {
                // assessment failed to save
                console.log(data); 
            }
        });

JS 方法:

你要做的第一件事就是打开你的请求......

var xhr= new XMLHttpRequest(); 
xhr.open("POST", "write_data.php", true);

试试这个...

xhr.open("POST", "write_data.php", true);

那么你可以使用这种方式来做......

xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("fname=Wubur&lname=Com");

或者 JSON 方式...

xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify({fname:"Harry", lname:"Potter"}));

yourFile.php(我们要发布到的地方):

如果你使用第一种方法(不是 json)...

<?php 

if(isset($_POST['fname']) && isset($_POST['lname']){ // check for post param & permission to create template 
    // do stuff here... 
    echo 'success'; // if everything worked
} else {
    echo 'I need fname and lname!!!'; // no post params supplied 
}

?>

如果你使用 JSON 方法...

<?php 

$data = json_decode(file_get_contents('php://input'), true);
$data2 = json_decode(file_get_contents('php://input'));
// try both, I forget which one it is...
echo "success";

?>

【讨论】:

  • 谢谢!我的结构如下: .php 位于带有 AJAX 调用的 .html 目录中,并且在该目录中存在 .csv 应该转到的“数据”文件。因此,如果我了解了您回复的要点,我觉得结构设置正确。我说的对吗?
  • 我也尝试更改内容类型,但没有成功:(
  • 您需要更改内容类型并摆脱 JSON 字符串化。在 PHP 上做 echo $_POST['filename']
  • 喜欢这个? xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhr.send({filename: name, filedata: data});
  • 我更新了我的答案。它有所有的选择。相信你一定能想出来的:)
【解决方案2】:

我猜$_POST['filename']; 是空的。错误:

警告:file_put_contents(data/) [function.file-put-contents]:打开流失败:是一个目录

不言自明,甚至显示data/。注意到“/”后面没有文件名了吗?检查您收到的帖子。

更多详情

超级全局$_POST 没有密钥filename 或该密钥为空。这行代码$filename = 'data/'.$_POST['filename']; 生成:data/。所以$_POST['filename'] 要么是空的,要么不存在。使用var_dumpprint_r 检查$_POST 并查看其中的内容。

【讨论】:

  • 非常感谢!我检查了控制台,它在“请求有效负载”中显示文件数据和文件名正在正确发送。
  • PHP 中检查您的 $_POST 数据。该错误清楚地显示了“data/”,它确实是一个目录而不是文件名。
  • 我真的很抱歉,但我有点不懂你的意思。我想有一些重要的东西在躲避我。我尝试了这些方法,但仍然遇到相同的错误:stackoverflow.com/questions/3496971/check-if-post-exists
  • 尝试print_r($_POST) 之类的方法来查看 PHP 接收数据时的确切结构。
  • 谢谢你:)。它显示了一个空数组(Array ( ) )。
【解决方案3】:

问题似乎与您的内容类型有关。在 PHP 中,application/x-www-form-urlencodedmultipart/form-data 中只有一个 Content-Type 填充了 $_POST 超级全局数组。由于您告诉服务器您正在通过application/json 发送数据,因此您需要通过以下方式从请求正文中获取数据:

php://input

试试这个:

$params = json_decode("php://input", TRUE);
$filename = 'data/'.$params['filename'];
$data = $params['filedata'];
file_put_contents($filename, $data);

【讨论】:

  • 非常感谢!我尝试了代码但它没有改变任何东西(同样的错误并且数组仍然是空的)
  • 如果您需要更多信息,请参见stackoverflow.com/questions/19004783/… OP
  • @PetrPalíšek 有趣。我以前没有遇到过。您是否能够验证数据是否正确发布?尝试在您的浏览器开发工具中查看请求负载,通常在 Network 选项卡下。您应该会看到一个标记为:xhr 的请求,其中包含您设置的内容类型以及传递到此服务器的数据。
  • 是的,这就是让我困惑的地方。请求有效负载准确地显示了它应该显示的内容。
  • 毕竟你的代码也帮助了我 :) 我只是没有意识到如何在 Js 中镜像它。谢谢!
猜你喜欢
  • 2018-03-08
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2013-01-22
  • 2019-02-10
  • 2019-06-30
  • 2010-11-14
  • 2014-10-28
相关资源
最近更新 更多