2009-08-31 4 views
2

Depuis vendredi, je me fais des reproches à ce sujet et je deviens fou. Je souhaite que l'utilisateur puisse soumettre un formulaire avec une image et que cette image soit stockée dans une base de données. Ensuite, je veux que cette image soit affichée sur mon index.ASP.NET MVC - J'ai du mal à stocker et à afficher une image dans une base de données

J'ai déjà essayé tous les autres sujets d'aide de stackoverflow ici et aucun d'entre eux ne fonctionne pour moi. Je suis les instructions dans "Pro ASP.NET MVC Framework" par Steven Sanderson (pages 195-198), et il ne fonctionne tout simplement pas. Cela fonctionne très bien dans son exemple d'application qui accompagne le livre.

J'ai créé une application de test MVC qui a l'index et crée des vues. C'est en train d'enregistrer quelque chose dans la base de données parce que je peux voir le champ "Données binaires" rempli avec ces deux mots. Mais il ne s'affichera pas. Je ne sais pas si elle ne s'affichera pas parce que je sauvegarde l'image dans la base de données, ou quelque chose d'autre.

Il ya juste beaucoup trop de code à poster ici, mais j'ai compilé une simple application dans un fichier .zip qui montre exactement ce que j'essaie d'accomplir. J'espère que c'est autorisé. Est-ce que l'un de vos experts MVC pourrait le télécharger et me dire ce que je fais de mal et pourquoi cela ne fonctionne pas? Je suis à bout de patience et je suis tellement confus.

S'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations.

Merci beaucoup, Shawn

Mon fichier est situé à: http://www.fraxis.com/test.zip

Il a été construit en utilisant Visual Studio 2008 avec .NET 3.5 (SP1) et ASP.NET MVC 1.0. Tout est dans HomeController et dans la vue d'accueil. Indexer et créer. La base de données est dans app_data.

Répondre

2

Dans votre ligne, remplacer la classe HomeController 52:

image.InputStream.Read(TableToCreate.Image, 0, image.ContentLength); 

avec ces 2 lignes:

BinaryReader reader = new BinaryReader(image.InputStream); 
TableToCreate.Image = reader.ReadBytes(image.ContentLength); 
+0

Cela a très bien fonctionné! Merci beaucoup. Pourquoi pas: image.InputStream.Read (TableToCreate.Image, 0, image.ContentLength); travail? Cela fonctionne très bien dans l'exemple d'application de l'auteur. Il utilise cette même ligne de code exacte. Pourquoi ça ne marcherait pas pour moi? Merci encore, Shawn – fraXis

+0

Je n'ai aucune idée de ce qui s'est passé avec le code, mais il n'y avait pas d'octets écrits dans TableToCreate.Image. Peut-être que l'auteur n'a pas testé ce code. – ZippyV

1

Vérifiez ce poste out.

Having troubles calling a Controller Post Method…

EDIT

Je suis ce qui suit pour obtenir l'image en arrière;

Contrôleur;

public FileResult GetImage(int id) 
{ 
    return File(PhotoHelper.GetImageBytes(id), "image/jpeg"); 
} 

À mon avis;

<%= Html.Image("img", "/Photos/GetImage?id=" + Model.Photo.Id.ToString(), "BioPic", new { Width = "350px" })%> 

donc essentiellement j'ai sauvé un flux d'octets à une base de données puis de les récupérer, puis l'image est saisissant cette image d'une action dans mon contrôleur appelé GetImage.

Est-ce que cela répond à votre question?

+0

Qu'en est-il de la création de vignettes? – Paul

+0

@Paul Vous pouvez les redimensionner en utilisant le code C#. Vous feriez mieux de poster une nouvelle question. – griegs

0
Public int InsertUpdateImage(
     ref System.Data.SqlClient.SqlConnection _SqlConnection, 
     string _SQL, 
     System.Drawing.Image _Image, 
     string _ImageFieldName, 
     System.Drawing.Imaging.ImageFormat _ImageFormat) 
{ 
    int _SqlRetVal = 0; 

    try 
    { 
     // lets add this record to database 
     System.Data.SqlClient.SqlCommand _SqlCommand 
      = new System.Data.SqlClient.SqlCommand(_SQL, _SqlConnection); 

     // Convert image to memory stream 
     System.IO.MemoryStream _MemoryStream = new System.IO.MemoryStream(); 
     _Image.Save(_MemoryStream, _ImageFormat); 

     // Add image as SQL parameter 
     System.Data.SqlClient.SqlParameter _SqlParameter 
      = new System.Data.SqlClient.SqlParameter("@" + _ImageFieldName, SqlDbType.Image); 

     _SqlParameter.Value = _MemoryStream.ToArray(); 
     _SqlCommand.Parameters.Add(_SqlParameter); 

     // Executes a Transact-SQL statement against the connection 
     // and returns the number of rows affected. 
     _SqlRetVal = _SqlCommand.ExecuteNonQuery(); 

     // Dispose command 
     _SqlCommand.Dispose(); 
     _SqlCommand = null; 
    } 
    catch (Exception _Exception) 
    { 
     // Error occurred while trying to execute reader 
     // send error message to console (change below line to customize error handling) 
     Console.WriteLine(_Exception.Message); 

     return 0; 
    } 

    return _SqlRetVal; 
} 
Questions connexes