Server.MapPath выдает ошибку при использовании библиотеки обрезки веб-изображений
-
12-11-2019 - |
Вопрос
У меня есть изображение, хранящееся на сервере по адресу:
C:\inetpub\wwwroot\imageupload\images
в моем коде я хочу использовать изображение из изображений папок, поэтому я пытаюсь сделать следующее:
Server.MapPath("/images/sample1.jpg")
Но я получаю ошибку:
Помогите пожалуйста решить ошибку
Как и в нескольких ответах с просьбой опубликовать код, он выглядит следующим образом.
.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);
}
}
Метод обрезки взят из файла .dll, который я использовал http://imagecropping.codeplex.com/
Решение
Там ошибка в CSA.Web.UI.CropImage.Crop
метод, как описано в трассировке стека.
Server.MapPath
, насколько мне известно, не вернет нулевую строку (он выдаст исключение, если не сможет отобразить - но не NullReferenceException
).
Я бы посоветовал вам изучить метод, который я упоминаю, и, возможно, также опубликовать соответствующий код.
РЕДАКТИРОВАТЬ:
Итак, я бегло рассмотрел Crop
код из проект CodePlex вы упомянули и нашли следующие строки (форматирование мое):
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);
Теперь мне кажется, что:
- Аргумент
Path
не равно нулю* - Аргумент
ImageUrl
является нулевой**
*Хотя это может быть «неправильно», сейчас проблема не в этом.
** Имеется в виду звонок ToString
является фактором ломки в этом коде.
По сути, элемент управления не имеет изображения для обрезки, и это видно из вашего собственного кода:
//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"));
Исправление состоит в том, чтобы указать изображение через ImageUrl
, AFAIK, однако я не понимаю, как это сделать.
Другие советы
Вы сохранили свои изображения в imageupload\images
но когда вы попытались их схватить, вы забыли добавить imageupload
каталог:
Server.MapPath("/imageupload/images/sample1.jpg")
Попробуйте относительный путь вместо этого:
Server.MapPath("images/sample1.jpg")
. Рассмотреть возможность использования «~ / изображений / образец1.jpg» для вашего источника.«~» заменит имя приложения в вызове на Server.mappath
В соответствии с:https://webcropimage.svn.codeplex.com/svn/trunk/CS.WebControls/WebCropImage/CropImage.cs
Метод Crop() дает путь, по которому нужно сохранять обрезанное изображение.
Какое изображение следует обрезать, хранится в wci1.ImagePath
Пожалуйста, проверьте, соответствует ли это значение нулевой, и это должно указать на проблему.
Поскольку нет <Form runat="Server">
, возможно, он не может получить доступ к ViewState:
private string ImagePath { get { return ViewState["ImageUrl"].ToString(); } }