Как создать файл в памяти, а затем отправить файл пользователю через asp.net mvc + jquery? - PullRequest
2 голосов
/ 09 января 2010

Я использую библиотеку календарей Dday и хочу экспортировать календари пользователей. Поэтому я использую Dday, чтобы взять все записи пользователей и сделать их в формате ics (.ics).

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

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

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

Опять же, если это много работы, я остановлюсь на чем-то на стороне сервера, как asp.net mvc обрабатывает все это.

Но я не знаю, как это сделать.

Так как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 12 января 2010

Вам необходимо вернуть тип FileStreamResult с MVC

public FileStreamResult MyFunction(/*your parms*/)
{
    System.IO.MemoryStream stream = FunctionThatCreatesMyCalendarStream();
    //you may need stream.Position = 0 here depending on what state above funciton leaves the stream in.
    //stream.Position = 0;
    FileStreamResult result = new FileStreamResult(stream, "text/calendar");
    result.FileDownloadName = "myfiledownloadname.ics";
    return result;
}
0 голосов
/ 12 января 2010

Вы можете использовать свой собственный результат действия: (Понятия не имею, что делает DCal, поэтому здесь)

public class DCalResult : ActionResult
{
    private readonly ISomeDCalInterface _dcalObject;

    public DCalResult(ISomeDCalInterface dcalObject)
    {
        _dcalObject = dcalObject;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;    
        response.ClearHeaders();
        response.ContentType = "text/calendar";
        response.Write(_dcalObject.ToString());
    }
}

Тогда в ваших действиях контроллеров верните:

public ActionResult DCal()
{
    return new DCalResult(usersDcalObject);
}
0 голосов
/ 09 января 2010

Вам нужен обработчик на стороне сервера, который будет генерировать данные, установите HttpResponse.ContentType на соответствующий тип MIME, а затем вам нужно будет записать данные в HttpResponse.ResponseStream или использовать метод HttpResponse.Write.

Пример (CalendarHandler.ashx):

public class CalendarHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/calendar";
        var calendarData = @"
 BEGIN:VEVENT
 UID:19970901T130000Z-123402@host.com
 DTSTAMP:19970901T1300Z
 DTSTART:19970401T163000Z
 DTEND:19970402T010000Z
 SUMMARY:Laurel is in sensitivity awareness class.
 CLASS:PUBLIC
 CATEGORIES:BUSINESS,HUMAN RESOURCES
 TRANSP:TRANSPARENT
 END:VEVENT";
        context.Response.Write(calendarData);
    }
}

Теперь вам нужно всего лишь сделать запрос к CalcHandler.ashx, используя ajax или обычными методами.

Примечание: я не знаю, являются ли это действительными данными об отмене, я просто взял случайный пример из RFC http://tools.ietf.org/html/rfc2445

Если вы сделаете это, вам не нужно будет создавать файл в любое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...