2016-08-17 2 views
0

Je souhaite faire un téléchargement de mes documents dans la base de données. (MVC5, Varbinary)ASPNET MVC5, fichiers Database Télécharger, Varbinary

Au début, je stocker ces documents dans un dossier sur le serveur ("ServeurPathFolder/IdUser"), et cela fonctionne parfaitement =>Screenshot

Maintenant, je souhaite enregistrer ces fichiers dans la base de données avec le même contrôleur.

=> Avec le mode Debug, je me sens bien dans le UploadController mais tous mes paramètres sont NULL et enfin il y a une EXCEPTION NULL REFERENCE savez-vous pourquoi?

public JsonResult Upload(FilesIndexViewModel model, HttpPostedFileBase files) 

MyDatabase

Mon ViewModel

public class FilesIndexViewModel 
    { 
     [Required] 
     public HttpPostedFileBase File { get; set; } 

     public byte ID_TYPE { get; set; } 

     public byte ID_CR{ get; set; } 

     public string ID_CREATEUR { get; set; } 

     public DateTime DT_CREATION { get; set; } 

     public string LIB { get; set; } 

     public string TEXT { get; set; } 

     public string CD_CONTENT_TYPE { get; set; } 
    } 

Mon point de vue (_files)

@using (Html.BeginForm("Upload", "FileUpload", FormMethod.Post, new { encType = "multipart/form-data" })) 
{ 
    <form id="fileupload"> 
     @*<form id="fileupload" method="POST" enctype="multipart/form-data" data-url="@Url.Action("Upload", "FileUpload")">*@ 
      <div class="row fileupload-buttonbar"> 
       <div class="col-lg-7"> 
        <!-- The fileinput-button span is used to style the file input field as button --> 
        <span class="btn btn-success fileinput-button"> 
         <i class="glyphicon glyphicon-plus"></i> 
         <span>Add files...</span> 
         <input type="file" name="files[]" multiple> 
        </span> 
        <button type="submit" class="btn btn-primary start"> 
         <i class="glyphicon glyphicon-upload"></i> 
         <span>Start upload</span> 
        </button> 
        <button type="reset" class="btn btn-warning cancel"> 
         <i class="glyphicon glyphicon-ban-circle"></i> 
         <span>Cancel upload</span> 
        </button> 
        <button type="button" class="btn btn-danger delete"> 
         <i class="glyphicon glyphicon-trash"></i> 
         <span>Delete</span> 
        </button> 
        <input type="checkbox" class="toggle"> 
        <!-- The global file processing state --> 
        <span class="fileupload-process"></span> 
       </div> 
       <!-- The global progress state --> 
       <div class="col-lg-5 fileupload-progress fade"> 
        <!-- The global progress bar --> 
        <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100"> 
         <div class="progress-bar progress-bar-success" style="width:0%;"></div> 
        </div> 
        <!-- The extended global progress state --> 
        <div class="progress-extended">&nbsp;</div> 
       </div> 
      </div> 
      <!-- The global progress state --> 
      <div class="col-lg-5 fileupload-progress fade"> 
       <!-- The global progress bar --> 
       <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100"> 
        <div class="progress-bar progress-bar-success" style="width:0%;"></div> 
       </div> 
       <!-- The extended global progress state --> 
       <div class="progress-extended">&nbsp;</div> 
      </div> 

      <!-- The table listing the files available for upload/download --> 
      <table role="presentation" class="table table-striped"><tbody class="files"></tbody></table> 
     </form> 

Et mon contrôleur

[AcceptVerbs(HttpVerbs.Post)] 
[HttpPost] 
public JsonResult Upload(FilesIndexViewModel model, HttpPostedFileBase files) 
{ 
    var uploadedFile = (model.File != null && model.File.ContentLength > 0) ? new byte[model.File.InputStream.Length] : null; 
    if (uploadedFile != null) 
    { 
     model.File.InputStream.Read(uploadedFile, 0, uploadedFile.Length); 
    } 
    CTG_DOCUMENT image = new CTG_DOCUMENT 
    { 
     ID_TYPE = model.ID_TYPE, 
     ID_CR = model.ID_CR, 
     ID_CREATEUR = model.ID_CREATEUR, 
     DT_CREATION = DateTime.Now, 
     LIB = model.LIB, 
     DOCUMENT = uploadedFile, 
     CD_CONTENT_TYPE = model.CD_CONTENT_TYPE 
    }; 
    db.CTG_DOCUMENT.Add(image); 
    db.SaveChanges(); 

    var resultList = new List<ViewDataUploadFilesResult>(); 

    var CurrentContext = HttpContext; 

    filesHelper.UploadAndShowResults(CurrentContext, resultList); 
    JsonFiles Jfiles = new JsonFiles(resultList); 

    bool isEmpty = !resultList.Any(); 


    if (isEmpty) 
    { 
     return Json("Error "); 
    } 
    else 
    {    
     return Json(Jfiles); 
    } 
} 

Merci pour votre aide!

Répondre

0

Votre élément d'entrée dans les fichiers de navigateur doit avoir la même valeur d'attribut de nom que votre paramètre de méthode d'action de type HttpPostedFileBase.

jour donc votre code de vue de rasoir ont le nom de l'élément d'entrée comme "files"

<input type="file" name="files" multiple> 

De plus, je vois que vous avez plusieurs attributs sur l'élément d'entrée de fichier. Si vous préférez envoyer plusieurs fichiers, vous devez mettre à jour votre paramètre de méthode d'action à une collection de HttpPostedFileBase.

[HttpPost] 
public JsonResult Upload(FilesIndexViewModel model,IEnumerable<HttpPostedFileBase> files) 
{ 
    // loop through files after making sure it is not null 
} 

J'ai aussi remarqué que vous avez déjà une propriété dans votre modèle de vue du type HttoPostedFileBase. Dans ce cas, vous n'avez pas besoin du second paramètre dans votre méthode d'action HttpPost.

et votre méthode d'action peut être

[HttpPost] 
public JsonResult Upload(FilesIndexViewModel model) 
{ 
    //check model.File property value 
} 

En outre, comme je l'ai mentionné plus tôt, si vous voulez soutenir le téléchargement de fichiers Muliple, modifiez simplement la propriété de votre modèle en vue d'une collection de HttpPostedFile