Как создать файл (.aspx, html, txt) в памяти? - PullRequest
0 голосов
/ 15 ноября 2009

Я хочу создать файл с расширением .aspx (или любым другим расширением) полностью в памяти. Можно ли это сделать?

Сейчас у меня есть поток памяти, в котором есть все, что я хочу записать в этот файл, но на самом деле я не хочу создавать физический файл на сервере, так как тогда мне, вероятно, придется включить разрешения на запись для моего сервера. Я хочу создать файл в памяти и загрузить его через ftpWebRequest.

Edit.

Я, должно быть, делаю что-то не так, потому что в моем файле есть странные вещи, настолько странные, что я даже не могу вставить это в свои сообщения.

По сути, это куча квадратов между всем. Как будто это почти кажется, что это заполняет это для пробелов. Например, если я присмотрюсь, я увижу тег, но между буквами будет квадрат.

Вот часть моего кода. Может быть, я использую неправильную кодировку?

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 ]

5 голосов
/ 16 ноября 2009

Вы можете преобразовать 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();
0 голосов
/ 15 ноября 2009

Что ж, такой файл на самом деле представляет собой простой текст с определенным форматированием - HTML 4.0, XHTML и т. Д.

Так что да, вы можете создать это в памяти - например, внутри. StringBuilder, а затем сохраните его обратно на диск, используя StreamWriter или каким-либо другим способом.

Если вы не можете или не хотите записывать его на диск, вы, конечно, также можете поместить его в MemoryStream, и интерфейсы, которые могут читать из любого произвольного потока, могут также читать из потока памяти .

Проверьте документы MSDN по FtpWebRequest и по методу GetRequestStream () . В нем есть пример того, как загрузить из потока на 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...