【发布时间】:2011-07-26 00:09:49
【问题描述】:
我想让它通过按下主页上的按钮,用户将能够在网站的服务器上创建一个新的 html 页面(例如 www.example.com/0002.html)我需要这个页面永远在那里,每个人都可以访问。如何使用 asp.net 以编程方式创建 html 页面?
【问题讨论】:
我想让它通过按下主页上的按钮,用户将能够在网站的服务器上创建一个新的 html 页面(例如 www.example.com/0002.html)我需要这个页面永远在那里,每个人都可以访问。如何使用 asp.net 以编程方式创建 html 页面?
【问题讨论】:
根据你的cmets,你需要的是按钮点击事件代码中的这样的代码:
//get all HTML files in current directory that has numeric name:
string strRootPath = Server.MapPath(".");
List<string> arrExistingFiles = Directory.GetFiles(strRootPath, "*.html").ToList().FindAll(fName =>
{
int dummy;
return Int32.TryParse(Path.GetFileNameWithoutExtension(fName), out dummy);
});
//calculate next number based on the maximum file name, plus 1:
int nextFileNumber = arrExistingFiles.ConvertAll(fName => Int32.Parse(Path.GetFileNameWithoutExtension(fName))).Max() + 1;
//generate file name with leading zeros and .html extension:
string strNewFileName = nextFileNumber.ToString().PadLeft(5, '0') + ".html";
string strNewFilePath = Server.MapPath(strNewFileName);
//write contents:
File.WriteAllText(strNewFilePath, body);
//let user option to see the file:
litCreateFileResult.Text = string.Format("File created successfully. <a href=\"{0}\" target=\"_blank\">View</a>", strNewFileName);
代码被注释了很多,唯一值得添加的是最后一行,为了让它起作用,请将其添加到您的.aspx 表单中:
<asp:Literal ID="litCreateFileResult" runat="server" />
【讨论】:
protected void Button1_Click(object sender, EventArgs e)
{
string body = "<html><body>Web page</body></html>";
//number of current file
int filenumber = 1;
string numberFilePath = "/number.txt";
//change number if some html was already saved and number.txt was created
if (File.Exists(Server.MapPath(numberFilePath)))
{
//open file with saved number
using (StreamReader sr = new StreamReader(numberFilePath))
{
filenumber = int.Parse(sr.ReadLine()) + 1;
}
}
using (StreamWriter sw = new StreamWriter(Server.MapPath(filenumber.ToString("D4") + ".html")))
{
sw.Write(body);
//write last saved html number to file
using (StreamWriter numberWriter = new StreamWriter(Server.MapPath(numberFilePath), false))
{
numberWriter.Write(filenumber);
}
}
}
这是我能想到的最简单的方法。我没有测试它,但它应该可以工作。无论如何,最好将数据库用于此类事情。而且我没有添加任何 try-catch 代码来保持代码简单...
【讨论】:
File 类提供了静态方法来在一行中创建和写入文本文件。无需存储最后一个值,您可以迭代现有文件以找到“最大值”。
在最基本的情况下,您可以使用流编写器创建一个新的文本文件,其中包含 HTML 标记。
var filePath = ""; // What ever you want your path to be
var contentOfPage = "<html>Whatever you are writing</html>";
using (StreamWriter writer = new StreamWriter(Server.MapPath(filePath))
{
writer.WriteLine(contentOfPage);
}
重要的是,您将如何决定文件名是什么?如果您不为此添加机制,您将每次都覆盖同一个文件!
现在你可以使用内置的 .Net 方法了,它很丑,但我想它可以工作。
fileName = System.IO.Path.GetRandomFileName();
// You may want to put an html on the end in your case
fileName = System.IO.Path.GetRandomFileName() + ".html";
如果我做到了,出于 SEO 的目的,我可能会采用定制的方式,但如果这不重要的话
【讨论】:
要在服务器上创建文件,您的服务器端代码需要使用 FileStream 来写入磁盘,就像您在普通桌面应用程序中写入磁盘一样。您需要做的一件事是将其写入您网站所在的目录中。
一些写文件的代码:
using (StreamWriter sw = new StreamWriter(Server.MapPath("fileName.html")))
using (HtmlTextWriter writer = new HtmlTextWriter(sw))
{
writer.RenderBeginTag(HtmlTextWriterTag.Html);
writer.RenderBeginTag(HtmlTextWriterTag.Head);
writer.Write("Head Contents");
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Body);
writer.Write("Body Contents");
writer.RenderEndTag();
writer.RenderEndTag();
}
【讨论】:
只需创建一个新文件并将其保存在可通过 .html 文件扩展名公开访问的位置。这是来自another SO question 的简短脚本:
using (StreamWriter w = new StreamWriter(Server.MapPath("~/page.html"), true))
{
w.WriteLine("<html><body>Hello dere!</body></html>"); // Write the text
}
【讨论】: