Server.mappath lance une erreur lors de l'utilisation de la bibliothèque de recadrage d'image Web
-
12-11-2019 - |
Question
J'ai une image stockée sur le serveur à l'emplacement:
C:\inetpub\wwwroot\imageupload\images
Dans mon code, je veux utiliser une image à partir d'images de dossier, donc j'essaie comme suit:
Server.MapPath("/images/sample1.jpg")
Mais j'obtiens l'erreur comme:
S'il vous plaît, aidez-moi à résoudre l'erreur
Comme sur plusieurs réponses demandant à publier le code, c'est comme ça suivant
.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<%@ Register Assembly="CS.Web.UI.CropImage" Namespace="CS.Web.UI" TagPrefix="cs" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<cs:CropImage ID="wci1" runat="server" />
</body>
</html>
.aspx.cs
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
wci1.Crop(Server.MapPath("/imageupload/images/sample1.jpg"));
/*
this part is just to show the image after its been cropped and saved! so focus on just the code above.
*/
Image img = new Image();
img.ImageUrl = "images/sample1.jpg?rnd=" + (new Random()).Next(); // added random for caching issue.
this.Controls.Add(img);
}
}
La méthode de recadrage provient d'un fichier .dll que j'ai utilisé http://imagecropping.codeplex.com/
La solution
Une erreur est dans le CSA.Web.UI.CropImage.Crop
Méthode, comme décrit par la trace de pile.
Server.MapPath
, à ma connaissance, ne renverra pas de chaîne nulle (elle lancera une exception si elle ne peut pas mapper - mais pas un NullReferenceException
).
Je vous suggère de examiner la méthode que je mentionne et éventuellement de publier le code pertinent également.
ÉDITER:
Alors, j'ai jeté un coup d'œil Crop
coder de Le projet Codeplex Vous mentionnez et avez trouvé les lignes suivantes (mise en forme de la mine):
private string ImagePath { get { return ViewState["ImageUrl"].ToString(); } }
drawing.Image image = drawing.Image.FromStream(
new MemoryStream(
System.IO.File.ReadAllBytes(
HttpContext.Current.Server.MapPath(this.ImagePath)
)
)
);
cropedImage.Save(path);
Maintenant, il me semble que:
- Dispute
Path
est non nulle* - Dispute
ImageUrl
est nul**
* Bien que cela puisse être «incorrect», ce n'est pas le problème pour le moment.
** Cela signifie l'appel ToString
est le facteur de rupture de ce code.
Fondamentalement, le contrôle n'a pas d'image définie pour recadrer et cela est évident dans votre propre code:
//currently no ImageUrl set...
<cs:CropImage ID="wci1" runat="server" />
//your'e trying to crop here without an ImageUrl...
wci1.Crop(Server.MapPath("/imageupload/images/sample1.jpg"));
Le correctif consiste à spécifier une image via ImageUrl
, Afaik, mais je ne vois pas comment le faire.
Autres conseils
Vous avez stocké vos images imageupload\images
Mais quand vous avez essayé de les attraper, vous avez oublié d'ajouter le imageupload
annuaire:
Server.MapPath("/imageupload/images/sample1.jpg")
Essayez plutôt un chemin relatif:
Server.MapPath("images/sample1.jpg")
Envisagez d'utiliser "~ / images / exemple1.jpg" pour votre source. Le "~" est remplacé par le nom de l'application dans l'appel à server.mappath
Selon:https://webcropimage.svn.codeplex.com/svn/trunk/cs.webcontrols/webcropimage/cropimage.cs
Méthode culte (), donne un chemin où enregistrer L'image recadrée.
Quelle image doit être recadrée est stockée dans wci1.imagepath
Veuillez vérifier si cette valeur est nul, et cela devrait souligner le problème.
Comme il n'y a pas <Form runat="Server">
, peut-être qu'il ne peut pas accéder au Viewstate:
private string ImagePath { get { return ViewState["ImageUrl"].ToString(); } }