C # проблема новичка, часть 2 - объявление класса и метода - PullRequest
0 голосов
/ 26 марта 2010
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Upload(Photo photo)
{
    foreach (string file in Request.Files)
    {

        var path = "~/Uploads/Photos/";

        HttpPostedFileBase posted = (HttpPostedFileBase)Request.Files[file];

        if (posted.ContentLength > 0)
        {
            photo.Date = DateTime.Now;
            photo.AlbumID = 1;
            photo.Title = Path.GetFileName(posted.FileName);

            photoRepository.Add(photo);
            photoRepository.Save();

            posted.SaveAs(Server.MapPath(path + photo.PhotoID + ".jpg"));

            Image img1 = Image.FromFile(Server.MapPath("~/Uploads/Photos/") + photo.PhotoID + ".jpg");

            imageHelper.CreateThumbnail(posted, img1);

            int newWidth = 100;
            int newHeight = 100;
            double ratio = 0;

            if (img1.Width > img1.Height)
            {
                ratio = img1.Width / (double)img1.Height;
                newHeight = (int)(newHeight / ratio);
            }
            else
            {
                ratio = img1.Height / (double)img1.Width;
                newWidth = (int)(newWidth / ratio);
            }

            Image bmp1 = img1.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero);
            bmp1.Save(Server.MapPath("~/Uploads/Photos/Thumbnails/") + photo.PhotoID + ".jpg");

            img1.Dispose();
            bmp1.Dispose();
        }
    }

    return RedirectToAction("Index");
}

Я хотел бы немного лучше организовать этот код, примерно так:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Upload(Photo photo)
{
    foreach (string file in Request.Files)
    {

        var path = "~/Uploads/Photos/";

        HttpPostedFileBase posted = (HttpPostedFileBase)Request.Files[file];
        ImageHelper imageHelper = new ImageHelper();  

        if (posted.ContentLength > 0)
        {
            photo.Date = DateTime.Now;
            photo.AlbumID = 1;
            photo.Title = Path.GetFileName(posted.FileName);

            photoRepository.Add(photo);
            photoRepository.Save();

            posted.SaveAs(Server.MapPath(path + photo.PhotoID + ".jpg"));

            Image img1 = Image.FromFile(Server.MapPath("~/Uploads/Photos/") + photo.PhotoID + ".jpg");

            // Create thumbnail
            imageHelper.CreateThumbnail(posted, img1);                    
        }
    }

    return RedirectToAction("Index");
}

и здесь, в папке «Помощники», я создал класс и метод, который будет работать с миниатюрой:

public class ImageHelper
{        
    public void CreateThumbnail(HttpPostedFileBase posted, Image img1)
    {
        int newWidth = 100;
        int newHeight = 100;
        double ratio = 0;

        if (img1.Width > img1.Height)
        {
            ratio = img1.Width / (double)img1.Height;
            newHeight = (int)(newHeight / ratio);
        }
        else
        {
            ratio = img1.Height / (double)img1.Width;
            newWidth = (int)(newWidth / ratio);
        }

        Image bmp1 = img1.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero);
        bmp1.Save(Server.MapPath("~/Uploads/Photos/Thumbnails/") + photo.PhotoID + ".jpg");

        img1.Dispose();
        bmp1.Dispose();
    } 
}

Но я получаю ошибку компиляции, что Server (в классе ImageHelper в bmp1.Save(Server.MapPath ... строке) не существует в текущем контексте, хотя он работает нормально, если код находится в одном месте.
Что я делаю неправильно, и это даже правильный способ объявления метода и организации кода?

Заранее спасибо,
Ile

Ответы [ 2 ]

2 голосов
/ 26 марта 2010

Вместо того, чтобы ваш метод CreateThumbnail напрямую вызывал вещи из «Сервера», вместо этого вы должны передать эти ресурсы в вашу функцию. Это позволяет лучше разделять проблемы и, в конечном счете, лучше использовать повторно. Кроме того, это также исправит вашу проблему.

2 голосов
/ 26 марта 2010

Server является собственностью класса Controller. Вот почему он доступен в действии Update. Чтобы использовать его извне, вы можете получить его через HttpContext.Current.Server.

Это, однако, сделает ваш код менее тестируемым и более тесно связанным со спецификой ASP.NET. Скорее переписайте этот метод, чтобы он не зависел от каких-либо вещей, связанных с ASP.NET.

В этом конкретном случае вы можете добавить в метод дополнительный аргумент, который скажет ему, где сохранять эскизы:

void CreateThumbnail(Image img1, string targetDirectory)
...