发送 .txt 文件到客户端 c#
Sending .txt file to client c#
我很难从服务器获取文件并允许用户下载它。在我的机器上,我只是打开它,但由于它已经投入生产,这似乎不是一个可行的解决方案。
public HttpResponseMessage Post([FromBody]string[] info)
{
HttpResponseMessage resp = new HttpResponseMessage();
string html = info[0];
_file += info[2] + @"\media\";
try
{
using (StreamWriter sw = File.CreateText(_file))
{
for (int n = 0; n <= str.Length; n = n + 2)
{.WriteLine(str[n]);
}
}
do
{
string notepadPath = Environment.SystemDirectory + "\notepad.exe";
var startInfo = new ProcessStartInfo(notepadPath)
{
WindowStyle = ProcessWindowStyle.Maximized,
Arguments = _file
};
Process.Start(startInfo);
break;
} while (true);
}
catch (Exception ex)
{
//handled
}
return resp;
}
我曾尝试实现类似 this 的功能,但我什至无法将其配置为构建。如果那真的是最好的路线,有人可以详细解释一下以及如何去做吗?
在生产环境中,您将无法在 Web 服务器上启动 NotePad.exe 进程并期望任何人都能够访问它。
Web 服务器唯一能做的就是在 HTTP 响应中发出带有 content-disposition: attachment; filename=something.txt
的文件,并希望客户端已将 NotePad.exe 映射到正确的内容 type/extension。
这对我使用 MVC 5 有用。希望它对你也有用! :) 请记住,客户端机器需要自行决定如何处理该文件——您实际上没有任何控制权来启动客户端机器上的进程。在那条道路上是完全的 HTTP 无政府状态。
如果您正在即时创建文本文件,则只需使用 System.Text.Encoding.UTF8.GetBytes(yourStringHere) 即可,而无需实际创建文件 -为自己节省一些磁盘 IO 等等...
public void DownloadTest()
{
var filePath = @"c:\code\testFile.txt";
var reader = new StreamReader(filePath);
var data = reader.ReadToEnd();
var dataBinary = System.Text.Encoding.UTF8.GetBytes(data);
Response.ContentType = "text/plain";
Response.AddHeader("content-disposition", "attachment; filename=data.txt");
Response.BinaryWrite(dataBinary);
}
根据您的意见,应执行以下操作:
public HttpResponseMessage Post([FromBody]string[] info)
{
// create your file on the fly.
var txtBuilder = new StringBuilder();
for(int n = 0; n <= str.Length; n = n + 2)
{
txtBuilder.AppendLine(str[n]);
}
// make it as a stream
var txtContent = txtBuilder.ToString();
var txtStream = new MemoryStream(Encoding.UTF8.GetBytes(txtContent));
// create the response and returns it
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(txtStream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = info[0] // Not sure about that part. You can change to "text.txt" to try
};
return result;
}
我不确定您是如何获得文件名的以及它的扩展名是什么类型,但是您可以修改文件名和 Mime 类型来完成您的需要。
我很难从服务器获取文件并允许用户下载它。在我的机器上,我只是打开它,但由于它已经投入生产,这似乎不是一个可行的解决方案。
public HttpResponseMessage Post([FromBody]string[] info)
{
HttpResponseMessage resp = new HttpResponseMessage();
string html = info[0];
_file += info[2] + @"\media\";
try
{
using (StreamWriter sw = File.CreateText(_file))
{
for (int n = 0; n <= str.Length; n = n + 2)
{.WriteLine(str[n]);
}
}
do
{
string notepadPath = Environment.SystemDirectory + "\notepad.exe";
var startInfo = new ProcessStartInfo(notepadPath)
{
WindowStyle = ProcessWindowStyle.Maximized,
Arguments = _file
};
Process.Start(startInfo);
break;
} while (true);
}
catch (Exception ex)
{
//handled
}
return resp;
}
我曾尝试实现类似 this 的功能,但我什至无法将其配置为构建。如果那真的是最好的路线,有人可以详细解释一下以及如何去做吗?
在生产环境中,您将无法在 Web 服务器上启动 NotePad.exe 进程并期望任何人都能够访问它。
Web 服务器唯一能做的就是在 HTTP 响应中发出带有 content-disposition: attachment; filename=something.txt
的文件,并希望客户端已将 NotePad.exe 映射到正确的内容 type/extension。
这对我使用 MVC 5 有用。希望它对你也有用! :) 请记住,客户端机器需要自行决定如何处理该文件——您实际上没有任何控制权来启动客户端机器上的进程。在那条道路上是完全的 HTTP 无政府状态。
如果您正在即时创建文本文件,则只需使用 System.Text.Encoding.UTF8.GetBytes(yourStringHere) 即可,而无需实际创建文件 -为自己节省一些磁盘 IO 等等...
public void DownloadTest()
{
var filePath = @"c:\code\testFile.txt";
var reader = new StreamReader(filePath);
var data = reader.ReadToEnd();
var dataBinary = System.Text.Encoding.UTF8.GetBytes(data);
Response.ContentType = "text/plain";
Response.AddHeader("content-disposition", "attachment; filename=data.txt");
Response.BinaryWrite(dataBinary);
}
根据您的意见,应执行以下操作:
public HttpResponseMessage Post([FromBody]string[] info)
{
// create your file on the fly.
var txtBuilder = new StringBuilder();
for(int n = 0; n <= str.Length; n = n + 2)
{
txtBuilder.AppendLine(str[n]);
}
// make it as a stream
var txtContent = txtBuilder.ToString();
var txtStream = new MemoryStream(Encoding.UTF8.GetBytes(txtContent));
// create the response and returns it
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(txtStream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = info[0] // Not sure about that part. You can change to "text.txt" to try
};
return result;
}
我不确定您是如何获得文件名的以及它的扩展名是什么类型,但是您可以修改文件名和 Mime 类型来完成您的需要。