2016-10-05 2 views
0

Мое приложение позволяет пользователю загружать одно изображение, выбирая изображения: @Html.TextBoxFor(m => m.Image, new {type = "file"}). Если была какая-либо ошибка проверки, я теряю выбранный файл. Поэтому мне нужно временно сохранить его с помощью If(!ModelState.IsValid) блока кода:Перейти назад HttpPostedFileBase из вида → контроллер → назад к просмотру

public ActionResult Create(MyModel model) { 
    if (!ModelState.IsValid) 
    { 
     if(model.Image != null && model.Image.ContentLength > 0) { 
     var displayName = Path.GetFileName(model.Image.FileName); 
     var fileExtension = Path.GetExtension(displayName); 
     var fileName = string.Format("{0}{1}", Guid.NewGuid(), fileExtension); 
     var path = Path.Combine(Server.MapPath("~/App_Data/Files"), fileName); 
     model.Image.SaveAs(path); 
     model.displayName = displayName; 
     model.FilePath = path; 
     return View(model); 
    } 
} 

Я использую @Html.HiddenFor(m => m.FilePath) в поле зрения.

model.Image тип: HttpPostedFileBase. I must как-то переиздание пользователей выбрано Изображение как HttpPostedFileBase после !ModelState.IsValid, чтобы иметь возможность сохранить его в базе данных. Любой шанс вернуть информацию внутри @Html.TextBoxFor(m => m.Image, new {type = "file"})?

How I later convert HttpPostedFileBase to byte[], in order to store image-data in database.

Я не знаю, как сделать это с помощью инструментов у меня есть.

Edit: модель объекта:

public string displayName { get; set; } 
public string FilePath { get; set; } 
public HttpPostedFileBase Image { get; set; } 
+1

нет, вы не можете па его обратно в 'Html.TextBoxFor (м => m.Image, новый {тип =«файл»})' по соображениям безопасности. (см. [MVC File Upload сохранить выбранный файл] (http://stackoverflow.com/questions/29261726/mvc-file-upload-save-selected-file)). У вас уже есть скрытый ввод для пути к файлу, поэтому, если 'ModelSta te' теперь действителен после повторной отправки, затем получает файл, который вы сохранили, на основе значения скрытого ввода и преобразовывает его в массив байтов, если вы хотите сохранить его в базе данных –

+1

, например. используя 'byte [] bytes = System.IO.File.ReadAllBytes (model.FilePath);' –

ответ

1

Вы не можете установить значение входного файла по соображениям безопасности (он может быть установлен только на выбор пользователем файла в браузере).

По мнению, вам потребуется проверка условий для отображения имени файла и пути (первоначально он будет null)

@if (Model.displayName != null) 
{ 
    <div>@Model.displayName</div> // let the user know that its been uploaded 
    @Html.HiddenFor(m => m.FilePath) 
} 

Тогда в контроллере, если ModelState действительно, вам нужно условно проверить значение FilePath. В случае, если вы отправляете и ModelState недействительны, значение FilePath теперь будет содержать путь к файлу сохранения, когда пользователь повторно отправит. Но в том случае, когда ModelState действует на начальном представить, значение FilePath будет null

Вы код контроллера должен быть (заметьте, это предполагает MyModel на самом деле вид модель, и у вас есть соответствующая модель данных, содержащей свойство public byte[] Image { get; set; } для сохранения файла в таблице базы данных

public ActionResult Create(MyModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     .... // code as above to save temporary file and return the view 
    } 
    // Initialize an instance of your data model 
    var dataModel = new .... // assumes this contains a property byte[] Image 
    if (model.FilePath == null) 
    { 
     // The code above has never run so read from the HttpPostedFileBase property 
     if(model.Image != null && model.Image.ContentLength > 0) { 
     { 
      MemoryStream target = new MemoryStream(); 
      model.Image.InputStream.CopyTo(target); 
      dataModel.Image = target.ToArray(); 
     } 
    } 
    else 
    { 
     // Read from the temporary file 
     dataModel.Image = System.IO.File.ReadAllBytes(filename); 
     .... // Delete the temporary file 
    } 
    // Map other properties of your view model to the data model 
    // Save and redirect 
} 
Смежные вопросы