Сервер.MapPath выдает ошибку при использовании библиотеки обрезки веб-изображений

#c# #asp.net #crop #server.mappath

#c# #asp.net #обрезка #server.mappath

Вопрос:

У меня есть изображение, хранящееся на сервере по адресу:

 C:inetpubwwwrootimageuploadimages
  

в моем коде я хочу использовать изображение из папки 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 /

Комментарии:

1. Поместите разрешенный путь внутри строковой переменной, чтобы вы могли просматривать и отлаживать его. string imgPath = Server.MapPath("/images/sample1.jpg"); Каково значение переменной imgPath сейчас? Также обратите внимание, что ошибка возникает в классе CropImage , далее в вызове .Crop(string path)

2. Вы все еще не показываете нам Crop код.

3. @Mr . Disappointment Это метод из . я использовал DLL-файл. webcropimage.codeplex.com

Ответ №1:

Ошибка заключается в 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 не равен null*
  • Аргумент 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, однако я не вижу, как это сделать.

Комментарии:

1. Да, но обрезка не может сопоставить файл, поскольку местоположение неверно. Итак, сервер. Проблема не в MapPath.

2. @Theofanis Pantelides: Спасибо, что повторили именно то, что я сказал.

3. Голосую за нестандартное мышление.

4. Сэр, так что же мне теперь делать в моем проекте? Что мне нужно изменить?

5. @Ishan: Я обновил последнюю часть своего ответа, посмотрите, работает ли это для вас.

Ответ №2:

Вы сохранили свои изображения в imageuploadimages , но когда вы попытались захватить их, вы забыли добавить в imageupload каталог:

 Server.MapPath("/imageupload/images/sample1.jpg")
  

Комментарии:

1. Можете ли вы попробовать этот сервер. MapPath(«~/imageupload/images/sample1.jpg «)

2. Поскольку вы обновили свой вопрос сейчас, ясно, что проблема заключается в обрезке, а не в server.mappath проблема.

3. @Ishan: Вы пробовали выполнять сброс Server.MapPath("~/images/sample1.jpg") в строку, чтобы посмотреть, что она сообщает?

4. @Muhammad: Правильное ~ сопоставление было бы "~/images/sample1.jpg" , поскольку название проекта «imageupload» в любом случае обрабатывалось бы ~. 1 🙂

5. @Joel и проверке существования файла.

Ответ №3:

Попробуйте вместо этого относительный путь:

 Server.MapPath("images/sample1.jpg")
  

Ответ №4:

рассмотрите возможность использования «~ /images/sample1.jpg «для вашего исходного кода. «~» заменяется именем приложения при вызове сервера.MapPath

Ответ №5:

Согласно: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(); } }
  

Комментарии:

1. Которая уточняет ответ г-на Мухаммеда; чтобы быть справедливым.

2. 1) доработать: добавить детали к существующей идее. 2) мой комментарий относится к недопустимой странице .aspx, а не .cs 3) вы уже рассмотрели проблему.

3. @Ishan: Я работаю с той же библиотекой dll. как вы заставили это работать