2012-07-04 7 views
0

Longue histoire courte: je veux mettre une image dans une colonne d'un DataTable. Pour ce faire, j'ai rassemblé à partir de diverses autres sources que j'ai besoin de convertir l'image en octets, puis affecter les octets à la colonne DataRow souhaitée.Modifier une image en octet, pour le fichier * dans * projet

J'ai donc à peu près exactement ce dont j'ai besoin, SAUF, tous les guides que j'ai trouvés sont pour référencer des fichiers sur le système. L'image que j'ai besoin de convertir est dans le projet.

Voici ce que j'ai, en abrégé:

DataColumn amountcol = new DataColumn(); 
amountcol.DataType = System.Type.GetType("System.Byte[]"); 
//... 
newrow = dt.NewRow(); 
newrow[amountcol] = ReadImage("images/dashboard/myvacstatus-am.png", new string[] { ".png" }); 

private static byte[] ReadImage(string p_postedImageFileName, string[] p_fileType) 
{ 
    bool isValidFileType = false; 

    try 
    { 
     FileInfo file = new FileInfo(p_postedImageFileName); 

     foreach (string strExtensionType in p_fileType) 
     { 
      if (strExtensionType == file.Extension) 
      { 
       isValidFileType = true; 
       break; 
      } 
     } 

     if (isValidFileType) 
     { 
      FileStream fs = new FileStream(p_postedImageFileName, FileMode.Open, FileAccess.Read); 
      BinaryReader br = new BinaryReader(fs); 
      byte[] image = br.ReadBytes((int)fs.Length); 
      br.Close(); 
      fs.Close(); 
      return image; 
     } 

     return null; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

Le problème: il recherche le fichier sur le système, et non au sein du projet.

je reçois l'erreur suivante:

Impossible de trouver une partie du chemin « C: \ Program Files (x86) \ Common Files \ Microsoft Shared \ devserver \ 10.0 \ images \ dashboard \ myvacstatus-AMPM .png '.

+0

Que voulez-vous dire de dans le projet? Voulez-vous dire que c'est dans le fichier de ressources? –

+0

Je veux dire que, dans mon projet, j'ai un dossier appelé "images", et le fichier se trouve dans ce dossier. Le projet peut se déplacer d'un ordinateur à l'autre, je dois donc pouvoir référencer ce dossier dans le projet. – CptSupermrkt

+1

vous devez obtenir le chemin complet en utilisant Server.MapPath() –

Répondre

1

Assurez-vous que le chemin à partir duquel vous lisez l'image est valide.

MISE À JOUR

Obtenez le chemin complet en utilisant le code suivant.

string path = Server.MapPath("images/dashboard/myvacstatus-am.png") 
+0

Merci, Server.MapPath a résolu mon problème de pouvoir localiser le fichier à partir du projet. Avoir un peu de mal à le faire apparaître dans le DataTable, mais c'est une question pour un autre jour :) Merci. – CptSupermrkt

0

Essayez d'utiliser un chemin d'accès absolu (à savoir, qualifié) plutôt que le chemin relatif enraciné non que vous avez spécifié ("images/tableau de bord/myvacstatus-am.png").

Vous ne devriez probablement pas essayer de lire le fichier à partir de la hiérarchie du dossier de projet. Au lieu de cela, spécifiez que les fichiers doivent être déployés dans le répertoire de déploiement (ou un sous-dossier) et lisez-les à partir de là. Sinon, vous rencontrerez des problèmes si vous distribuez l'application à des utilisateurs non développeurs.

+0

Comme le projet peut se déplacer d'un ordinateur à l'autre (il peut être sur le lecteur C: \ sur mon ordinateur, mais sur l'ordinateur D: \ sur mon collègue), je dois garder le chemin relatif. – CptSupermrkt

+0

@CptSupermarket c'est bien, mais vous devez garder à l'esprit que c'est relatif à * quelque chose *, et vous avez besoin d'un moyen de contrôler ce qu'est quelque chose. Voir la réponse éditée pour une idée. – phoog

+0

Nous ne sommes même pas près d'une étape de déploiement ou quelque chose comme ça. Tout est sujet à changement. Hardcoding dans un chemin arbitraire semble qu'il serait vraiment facile d'oublier de changer, car le projet se déplace d'un ordinateur à l'autre. – CptSupermrkt

0

Afin de rechercher le fichier dans la structure du dossier de l'application web, vous pouvez user Server.MapPath("/relative/url/tofile.png").

Ce fichier trouve le fichier et vous pouvez le lire en mémoire et faire ce qu'il faut faire avec. Mais attribuer simplement byte[] à la source de données pour le DataList n'entraînera pas l'affichage d'une image.

Afin de montrer l'image que vous aurez besoin de:

  • Ajouter une étiquette <img ... /> au bon endroit dans le DataList
  • L'attribut src de l'image doit pointer vers un endroit où les données d'image vous trouverez

sur la base de la configuration que vous avez (vous dites explicitement que le fichier est dans le projet), vous devriez être en mesure d'utiliser quelque chose comme ceci:

<asp:Image ID="image_myvacstatus" runat="server" 
    ImageUrl="~/images/dashboard/myvacstatus-am.png" /> 

Pas besoin de le charger en mémoire et de l'affecter à la source de données pour ListView.

Si vous devez déterminer quelle image à afficher en fonction d'autres données pour chaque ligne, vous pouvez ajouter le nom d'image correcte dans la source de données avant databinding et utilisation:

<asp:Image ID="image_myvacstatus" runat="server" 
    ImageUrl='<%# "~/images/dashboard/" + (string)Eval("imageName") %>' /> 
Questions connexes