HttpPostedFileBase.SaveКак работает, но файл не загружен и исключений нет - PullRequest
5 голосов
/ 05 октября 2011

Во-первых, вот мой код:

private Shoe ProcessForm(Shoe shoe, HttpPostedFileBase image)
{
    try
    {
        shoe.Slug = CMSHelper.SanitizeTitle(shoe.Name);
        shoe.LastModification = DateTime.Now;

        if ((image != null) && (image.ContentLength > 0))
        {
            string fileName = String.Concat(shoe.ShoeId, Path.GetExtension(image.FileName));
            shoe.Image = fileName;

            string filePath = Path.Combine(Server.MapPath(shoe.ImagePath), fileName);
            image.SaveAs(filePath);
        }
    }
    catch (Exception e)
    {
        throw e;
    }

    return shoe;
}

Локально, этот код работает нормально.Разрешения каталогов в порядке.И раньше он работал случайным образом на других серверах (я тестировал этот код на 4 или 5 разных серверах, пока тестировал VPS-провайдеров).

Но если я пытаюсь запустить его с домашнего компьютера, все проходит нормальнов базе данных сохранено имя файла, но файл не загружен.И никаких исключений не делается !!!

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

Ответы [ 7 ]

4 голосов
/ 05 октября 2011

Какая у вас модель взгляда?Прежде всего замените (Чистка обуви, изображение HttpPostedFileBase) на (FormCollection formCollection).Установите точку останова, чтобы убедиться, что вы получаете все отправленные значения.Если вы это сделаете, то возникнет проблема с привязкой модели, и нам нужно будет ее устранить.

Изменить

Можете ли вы установить точку останова на

image.SaveAs(filePath); 

Добавить наблюдение за переменными fileName и filePath.Я думаю, что путь к серверу не тот, который вы ожидаете, или, может быть, вы все вместе смотрите в неправильную папку.Скажите нам, каковы значения этих переменных.Также убедитесь, что ни одно исключение не выдается, когда вы проходите мимо image.SaveAs(filePath);

3 голосов
/ 19 октября 2011

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

Вместо вызова .SaveAs () я создал метод:

public static void WriteFileFromStream(Stream stream, string toFile)
{
    using (FileStream fileToSave = new FileStream(toFile, FileMode.Create))
    {
        stream.CopyTo(fileToSave);
    }
}

Я называю это так:

CMSHelper.WriteFileFromStream(image.InputStream, filePath);

И это все.

2 голосов
/ 31 декабря 2013

image.FileName содержит данные пути и выбирается

Path.Combine(Server.MapPath(shoe.ImagePath), fileName)

Попробуйте что-то вроде:

string pathForSaving = Server.MapPath("~/Upload/Images");
string uploadFileName = System.IO.Path.GetFileName(image.FileName);
string uploadFilePathAndName = Path.Combine(pathForSaving, uploadFileName);
image.SaveAs(uploadFilePathAndName);
0 голосов
/ 29 марта 2016

Я также столкнулся с той же проблемой, опубликованной в этой теме, и после нескольких попыток загрузки файла я обновил папку, в которой должны были находиться файлы, и, наконец, увидел их там.Не уверен, почему он не появился в первый раз после первого обновления, но, вероятно, это как-то связано с обновлением папки.Я сделал обновление из Visual Studio, и у меня также была кнопка «Показать все файлы».

0 голосов
/ 12 июля 2013

Убедитесь, что вы используете enctype = "multipart / form-data" в форме

http://www.prideparrot.com/blog/archive/2012/8/uploading_and_returning_files

0 голосов
/ 24 октября 2011

Вы проверяли, есть ли у вас несколько веб-серверов? Возможно, как балансировщик нагрузки. Это может не вызывать исключение, потому что на самом деле нет исключения, и файл действительно где-то существует, только не на том сервере, на котором вы полагаете, что он включен. Просто мысль (это случилось со мной раньше).

0 голосов
/ 17 октября 2011

Как вы настраиваете shoe.ImagePath?Ваша проблема выглядит так, как будто Server.MapPath возвращает значение, которое вы не ожидаете.

...