0

我正在编写具有 dojo 增强型数据网格的 Dojo Web 应用程序。在 datagid 填充数据后,我可以选择将文件保存到用户的机器上。为此,我使用 Dojo csv导出器从数据网格中以 CSV 格式创建字符串。在下面的代码中,我将该字符串传递给 csv.php 脚本,该脚本允许我将字符串保存为 csv 文件。

使用 dojo 导出器的代码:

var g = dijit.byId("grid");
g.exportGrid("csv", {
    writerArgs: {
        separator: ","
    }
}, function(str){
       debugger;
     //the code below is used if the user prefers to have call to the php script on a php enabled server
     var form = document.createElement('form');
     dojo.attr(form, 'method', 'POST');
     document.body.appendChild(form);
     dojo.io.iframe.send({
     url: "csv.php",
     form: form,
     method: "POST",
     content: {exp: str},
     timeout: 15000
     });

     document.body.removeChild(form);
});

csv.php 的 php 代码:

<?
$time = time();
header("Pragma: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=\"grid_$time.csv\"");
$exportedData = $_POST['exp'];
echo stripslashes($exportedData);
exit;
?> 

所以我遇到的问题是我正在使用 php 并且需要使用启用 php 的服务器。如果部署应用程序的人有这样的服务器,那么代码可以正常工作。但是,如果他使用 IIS 安装 php 并且需要在 IIS 中进行特定设置。我想编写无需额外设置即可在 II 上运行的代码。我在想 ASP 是要走的路,但我愿意接受任何建议和帮助。我如何在 asp 中重写 csv.php 代码。

谢谢

如果我的问题有问题,请不要删除它,但请告诉我要更改的内容。

更新:

这是我在 ashx 页面中的代码,但现在我得到“500 内部服务器错误”。我在 IIS 上安装了 asp.net,所以这不是问题。在 js 文件中,我只将 scv.php 更改为 csv.ashx。我必须使用不同的代码来调用 ashx 吗?

   <%

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;

namespace WebApplication2
{

    public class Handler1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
         context.Request.Files(0);
            Dim reader = new IO.StreamReader(context.Request.InputStream);
            Dim string = reader.ReadToEnd();
            context.Response.ContentType = "application/csv";
            context.Response.AddHeader("Content-Disposition", "attachment; filename=Whatever.csv");
            context.Response.AddHeader("content-length", context.Request.ContentLength.ToString());

            Response.Write("something");
            if( context.Response.IsClientConnected )
                context.Response.Flush();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
%>
4

2 回答 2

0

我无法在 php 方面提供帮助,但对于 asp.net,您可以编写一个通用处理程序 .ashx 页面。将您现有的页面发布到该页面,然后从那里您可以像您的 php 示例一样操纵响应。

context.Response.ContentType = "application/csv"
context.Response.AddHeader("Content-Disposition", "attachment; filename=Whatever.csv")
context.Response.AddHeader ("content-length", YourPostedData.Length)
context.Response.Write(YourPostedData)
If context.Response.IsClientConnected Then
    context.Response.Flush()
End If
于 2012-11-15T22:31:39.983 回答
0

我个人会使用 .Net 4.5 并创建一个简单的网络应用程序。我不喜欢php。

C# .Net 4.5 版本

经典 ASP 版本

这应该让你很好地了解如何做同样的事情。出于开发速度的原因,用经典的 ASP 编写它可能对您来说更值得......虽然,这已经过时了。

于 2012-11-15T22:22:48.887 回答