res.download()在我的情况下不起作用

时间:2013-11-24 16:34:43

标签: javascript node.js express

我使用nodejs和expressjs框架从服务器下载文件'jsonFile.json'。

我正在使用以下代码

res.get('/download', function(req, res) {
         res.setHeader('Content-disposition', 'attachment; filename=jsonFile.json');
          res.setHeader('Content-Type', 'text/json');
          res.download(__dirname + 'jsonFile.json');
        }
      });

但这导致对整个文件内容的响应。

我希望浏览器让我将文件保存在本地磁盘中。

如何将文件保存在本地磁盘中。???

2 个答案:

答案 0 :(得分:23)

让Express设置正确的标题,然后执行此操作:

res.get('/download', function(req, res) {
  res.download(__dirname + 'jsonFile.json', 'jsonFile.json');
});

doc

编辑,因为您通过AJAX调用请求/download,您必须更改设置,因为在这种情况下,大多数(所有?)浏览器都不会显示下载对话框。

相反,您可以从前端代码创建一个新窗口来触发对话框:

window.open('/download?foo=bar&xxx=yyy');

答案 1 :(得分:0)

只是为了确认@robert说的话,

因为这件事让我头晕了两天, 而不是使用ajax调用,打开一个带有ajax请求位置的新窗口,例如:

add_action( 'woocommerce_email_after_order_table', 'add_tracking_number_to_order_email', 10, 4 );
function add_tracking_number_to_order_email( $order, $sent_to_admin, $plain_text, $email )
{
    // (there is no current user ID for emails notifications)
    $has_discount = get_user_meta( $order->get_user_id(), 'billing_salesman', true );
    $po_number = get_post_meta( $order->get_id(), '_other_payment-admin-note', true );

    if( empty( $has_discount ) && empty( $po_number ) ) return; // Exit if empty

    // CSS style
    $styles = '<style>
        table.salesman-meta{width: 100%; font-family: \'Helvetica Neue\', Helvetica, Roboto, Arial, sans-serif;
            color: #737373; border: 1px solid #e4e4e4; margin-bottom:8px;}
        table.salesman-meta th, table.tracking-info td{text-align: left; border-top-width: 4px;
            color: #737373; border: 1px solid #e4e4e4; padding: 12px; width:50%;}
        table.salesman-meta td{text-align: left; border-top-width: 4px; color: #737373; border: 1px solid #e4e4e4; padding: 12px; width:50%;}
    </style>';

    // HTML Structure
    $html_output = '<h2>'.__('Some title').'</h2>
    <table class="salesman-meta" cellspacing="0" cellpadding="6">';

    if( ! empty( $has_discount ) ){
        $html_output .= '<tr class="sales-rep">
                <th>' . __( 'Sales Representative' ) . '</th>
                <td>' . $has_discount . '</td>
            </tr>';
    }

    if( ! empty( $po_number ) ){
        $html_output .= '<tr class="po-num">
                <th>' . __( 'PO Number' ) . '</th>
                <td>' . $po_number . '</td>
            </tr>';
    }

    $html_output .= '</table><br>'; // HTML (end)

    // Output styles CSS + HTML
    echo $styles . $html_output;
}

希望这有助于某人。