如何在内存中创建文件(.aspx,html,txt)?

时间:2009-11-15 20:53:08

标签: c# .net asp.net asp.net-mvc

我想在内存中创建一个扩展名为.aspx(或任何其他扩展名)的文件。可以这样做吗?

现在我有一个内存流,其中包含我要写入此文件的所有内容但我实际上并不想在服务器上创建物理文件,因为那时我可能必须为我的服务器启用写入权限。我想要做的是在内存中创建文件并通过ftpWebRequest上传。

编辑。

我一定做错了,因为我在文件中收到了奇怪的东西,所以很奇怪,我甚至无法将它粘贴到我的帖子中。

基本上它是一堆广场之间的一切。就像它几乎似乎它填补了它的空间。喜欢如果我仔细观察,我会看到标签仍然存在,但每个字母之间会有一个正方形。

这是我代码的一部分。也许我使用了错误的编码?

using (MemoryStream memory = new MemoryStream())
{
   UnicodeEncoding uniEncoding = new UnicodeEncoding();

   // readByline is the first bunch of data I want for my new file.
   memory.Write(uniEncoding.GetBytes(readByLine), 0, readByLine.Length);

   // second bunch of data I want for my new file.
   memory.Write(uniEncoding.GetBytes(html), 0, html.Length);

   // the follow code just figure out the end of the file that I am 
   // trying to extract some information out of.
   string readToEnd = reader.ReadToEnd();
   int endIndex = readToEnd.IndexOf(END_FLAG);
   endIndex += END_FLAG.Length;
   string restOfFile = readToEnd.Substring(endIndex);

   // once found I write it the memory stream. 
   memory.Write(uniEncoding.GetBytes(restOfFile),0,restOfFile.Length);

   // now I want to upload my file. I have the same file name already 
   // existing on the server? Do I have to tell it override it?
   FtpWebRequest request2 = (FtpWebRequest)WebRequest.Create(path);
   request2.Method = WebRequestMethods.Ftp.UploadFile;
   request2.Credentials = new NetworkCredential(ftpUsername, ftpPassword);

   // now I am trying your code.
   byte[] fileContents = memory.ToArray();

   using (Stream writer = request2.GetRequestStream())
   {
       writer.Write(fileContents, 0, fileContents.Length);
   }

   FtpWebResponse test = (FtpWebResponse)request2.GetResponse();

   return Content("test");
}

2 个答案:

答案 0 :(得分:5)

您可以将MemoryStream转换为byte[],然后使用WebClient.UploadData将文件通过FTP上传到某个服务器,而无需先将其写入客户端到磁盘:

webClient.UploadData(
    "ftp://remoteserver/remotepath/file.aspx"
    memoryStream.ToArray());

当然,FtpWebRequest也可以工作,但还需要更多代码:

FtpWebRequest ftpRequest;
FtpWebResponse ftpResponse;

ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://..."));
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
ftpRequest.Proxy = null;
ftpRequest.UseBinary = true;
ftpRequest.Credentials = new NetworkCredential("UserName", "Password");

using (Stream stream = ftpRequest.GetRequestStream())
using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
{
    writer.WriteLine("<html><head><title>Hello World</title></head>...");
}

ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();

答案 1 :(得分:0)

嗯,这样的文件实际上只是纯文本,具有某些格式 - HTML 4.0,XHTML等。

所以是的,你可以在内存中创建它 - 例如a StringBuilder,然后使用StreamWriter或其他方法将其保存回磁盘。

如果您不能或不想将其写入磁盘,您当然也可以将其写入MemoryStream,并且可以从任意流读取的接口可以从内存流中读取也是。

查看有关FtpWebRequest和GetRequestStream()方法的MSDN文档。它有一个关于如何直接从流上传到FTP的示例:

// Get the object used to communicate with the server.
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.Method = WebRequestMethods.Ftp.UploadFile;

// this could be your MemoryStream, of course, that you're reading from
StreamReader sourceStream = new StreamReader(fileName);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;

request.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();

FtpWebResponse response = (FtpWebResponse)request.GetResponse();
// check the response, do whatever you need to do with it
response.Close();