Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将数据从js传递到php并下载创建的csv文件_Javascript_Php_Ajax_File - Fatal编程技术网

Javascript 将数据从js传递到php并下载创建的csv文件

Javascript 将数据从js传递到php并下载创建的csv文件,javascript,php,ajax,file,Javascript,Php,Ajax,File,我必须使用$.post()将数组从JS传递到PHP,使用数组创建文件并下载它 使用此过程数组: $('#csv').click(function () { $.post( window.location + "crawler/save_to_file", { dane: wynik //array }); }); 现在在PHP中使用以下命令: $tablica=$_POST['dane']; $filename = "export-to-csv.c

我必须使用$.post()将数组从JS传递到PHP,使用数组创建文件并下载它

使用此过程数组:

$('#csv').click(function () {
$.post(
    window.location + "crawler/save_to_file",
    {
        dane: wynik //array
    });
  });
现在在PHP中使用以下命令:

$tablica=$_POST['dane'];
 $filename = "export-to-csv.csv";
                header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
                header("Content-type: text/csv");
                header("Content-Disposition: attachment; filename=\"$filename\"");
                header("Expires: 0");
                $fh = fopen( 'php://output', 'w' );
                $heading = false;
                if(!empty($tablica))
                    foreach($tablica as $row) {
                        if(!$heading) {
                            fputcsv($fh, array_keys($row));
                            $heading = true;
                        }
                        fputcsv($fh, array_values($row));
              }
                fclose($fh);
但当点击按钮创建并下载文件时,什么也没发生

谢谢

代码更新

JS文件:

   $.ajax({
        url: window.location + "crawler/",
        type: "POST",
        dataType: "json",
        data: {
            wartosc: zmienna
        },
        success: function (odp) {
            wynik = odp;  //array
            tab = JSON.stringify(odp);
            $.post(window.location + "crawler/return_data",
                {
                    data: tab
                },
                function (data) {
                    $('#wynik').html(data);
                    $('.pobierz').show();
                }
            )
        }
    })


$('.button').click(function() {
    var $form = $('<form action="' + window.location + 'crawler/save_to_csv" method="post"></form>');
    $.each(wynik, function() {
        $('<input type="hidden" name="dane[]">').attr('value', this).appendTo($form);
    });
    $form.appendTo('body').submit();
});
返回:“未定义索引:丹麦”

编辑


$tablica必须是
$\u POST
而不是
$\u GET

是否强制使用AJAX将该数组发送到PHP代码?如果是

否则,您可以使用包含数组项的隐藏输入构建一个隐藏表单,并通过JavaScript提交,而不是AJAX调用

更新 使用JS构建表单的简短示例:

$('#csv').click(function() {
  var $form = $('<form action="' + window.location + 'crawler/save_to_file" method="post"></form>');
  $.each(wynik, function() {
    $('<input type="hidden" name="dane[]">').attr('value', this).appendTo($form);
  });
  $form.appendTo('body').submit();
});
$('#csv')。单击(函数(){
变量$form=$('');
$.each(wynik,function(){
$('').attr('value',this).appendTo($form);
});
$form.appendTo('body').submit();
});

您是否被迫使用AJAX将该数组发送到PHP代码?如果是

否则,您可以使用包含数组项的隐藏输入构建一个隐藏表单,并通过JavaScript提交,而不是AJAX调用

更新 使用JS构建表单的简短示例:

$('#csv').click(function() {
  var $form = $('<form action="' + window.location + 'crawler/save_to_file" method="post"></form>');
  $.each(wynik, function() {
    $('<input type="hidden" name="dane[]">').attr('value', this).appendTo($form);
  });
  $form.appendTo('body').submit();
});
$('#csv')。单击(函数(){
变量$form=$('');
$.each(wynik,function(){
$('').attr('value',this).appendTo($form);
});
$form.appendTo('body').submit();
});

这可以通过AJAX完成,但您需要使用文件api。 所以你可以这样做:

$.post("csv.php", {
     dane: wynik //array
}, function(response){
   var blob = new Blob([response], { type:'text/csv' });
   alert(URL.createObjectURL(blob));
});
从警报中获取的url包含您的csv文件

当然,如果您想直接转到该文件,请将警报替换为:

window.location.href=URL.createObjectURL(blob);
更新

如果要使用自定义文件名,可以通过使用
a
元素来屏蔽
url.createObjectURL()
生成的url。 我们可以使用新的HTML5属性
download
,它允许我们屏蔽url

以下是更新的代码:

$.post("csv.php", {
     dane: wynik //array
}, function(response){
   var blob = new Blob([response], { type:'text/csv' }),
       a    = document.createElement('a'),
       url  = URL.createObjectURL(blob);

    // Put the link somewhere in the body
    document.body.appendChild(a);
    a.innerHTML = 'download me';
    a.href = url;
    // Set our custom filename
    a.download = 'myfilename.csv';
    // Automatically click the link 
    a.click();
});

这可以通过AJAX实现,但需要使用文件api。 所以你可以这样做:

$.post("csv.php", {
     dane: wynik //array
}, function(response){
   var blob = new Blob([response], { type:'text/csv' });
   alert(URL.createObjectURL(blob));
});
从警报中获取的url包含您的csv文件

当然,如果您想直接转到该文件,请将警报替换为:

window.location.href=URL.createObjectURL(blob);
更新

如果要使用自定义文件名,可以通过使用
a
元素来屏蔽
url.createObjectURL()
生成的url。 我们可以使用新的HTML5属性
download
,它允许我们屏蔽url

以下是更新的代码:

$.post("csv.php", {
     dane: wynik //array
}, function(response){
   var blob = new Blob([response], { type:'text/csv' }),
       a    = document.createElement('a'),
       url  = URL.createObjectURL(blob);

    // Put the link somewhere in the body
    document.body.appendChild(a);
    a.innerHTML = 'download me';
    a.href = url;
    // Set our custom filename
    a.download = 'myfilename.csv';
    // Automatically click the link 
    a.click();
});

你检查
非空$data
在哪里设置了
$data
吗?哦,写这个问题时忘记更改变量了,现在更新你检查
非空$data
在哪里设置了
$data
吗?哦,写这个问题时忘记更改变量了,现在更新你能给我一个例子链接吗?错误:“未定义索引:dane”在尝试使用$_POST['dane']捕获php文件中的数组时;@Marcin:您可以发布更新的代码吗?或者您可以使用Chrome DevTools或Firebug检查POST请求吗?您能给我一个示例链接吗?错误:“未定义索引:dane”在尝试使用$_POST['dane'捕获php文件中的数组时;@Marcin:你能发布你更新的代码吗?或者你能用Chrome DevTools或Firebug检查发布请求吗?谢谢,如果使用这个:window.location.href=URL.createObjectURL(blob);这是替换项,
a.click()
方法将触发click事件,因此您将获得该保存对话框。尝试一下。很高兴能提供帮助。
document.body.appendChild(a);
是不必要的,它可能会破坏布局。如果使用此方法,如何执行此操作:window.location.href=URL.createObjectURL(blob);这是替换项,
a.click()
方法将触发单击事件,因此您将获得保存对话框。尝试一下。很乐意提供帮助。
document.body.appendChild(a);
是不必要的,它可能会破坏布局