Предварительный просмотр ASP.NET MVC 3 - PullRequest
1 голос
/ 21 февраля 2012

Я использую MVC 3 и использую плагин AjaxUpload для загрузки изображения с использованием AJAX.Я не хочу сохранять изображение в файловой системе, вместо этого сохранить его в объекте сеанса и затем вывести поток для заполнения элемента управления изображением в форме?Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

4 голосов
/ 21 февраля 2012

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

Но в любом случае, вот как вы могли бы это сделать (при условии, что вы не читали или не заботились о моем предыдущем замечании):

[HttpPost]
public ActionResult Upload(MyViewModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    var buffer = new byte[model.File.InputStream];
    model.File.InputStream.Read(buffer, 0, buffer.Length);
    Session["uploadedFile"] = buffer;
    return View(model);
}

где свойство File в моделях представления является HttpPostedFileBase.Далее у вас может быть действие контроллера, которое будет обслуживать этот файл:

public ActionResult Image()
{
    byte[] buffer = (byte[])Session["uploadedFile"];
    return File(buffer, "image/png");
}

, и в представлении у вас будет тег <img>, указывающий на это действие:

<img src="@Url.Action("image")" alt="" />

СейчасКонечно, плагин AjaxUpload позволяет загружать файл с помощью AJAX, поэтому вам не нужно перезагружать всю страницу.Таким образом, в этом случае ваше действие контроллера может просто вернуть объект JSON, чтобы указать, успешно ли завершен процесс загрузки, а затем в обратном вызове успеха установить свойство src тега <img> для действия контроллера, которое будет обслуживать файл.

1 голос
/ 21 февраля 2012

Пример кода. Измените его на то, что вы хотите сделать. Не очень хорошая идея вставлять изображение в сеанс, если много пользователей. Лучше вставить его в БД, если он недолговечный или долгоживущий, в более постоянное хранилище (возможно, файловую систему).

    public ActionResult UploadImage()
    {
        foreach (string imageName in Request.Files)
        {
            HttpPostedFileBase file = Request.Files[imageName];
            if (file.ContentLength > 0)
            {
                BinaryReader br = new BinaryReader(file.InputStream);
                byte[] content = br.ReadBytes(file.ContentLength);
                Session[imageName] = content; // better to store in a db here
            }
        }
        return View();
    }

    // return the image (controller action)  /mycontroller/ViewImage?imageName=whatever
    public FileStreamResult ViewImage(string imageName)
    {
        byte[] content = (byte[])Session[imageName] ; // where ever your content is stored (ideally something other than session)
        MemoryStream ms = new MemoryStream(content);
        return new FileStreamResult(ms, "application/octet-stream"); // set content type based on input image, it might be png, jpg, gif etc.,
    }

Надеюсь, это поможет.

1 голос
/ 21 февраля 2012

SomeView.cshtml:

<img src="@Url.Action("/Image/Render")" />

ImageController.cs:

public ActionResult Render() {
   return File((byte[])Session["Avatar"], "image/jpeg")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...