Обслуживание Изображений от того же направленного URL соединяет каналом в ASP.NET MVC

Я рекомендую использовать Прекрасный Загрузчик плагин с этой целью. Ваш JavaScript код был бы:

$(document).ready(function() {
  $("#uploadbutton").jsupload({
    action: "addFile.do",
    onComplete: function(response){
      alert( "server response: " + response);
    }
  });
});

6
задан Joel Martinez 8 August 2009 в 16:53
поделиться

4 ответа

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

<img src="myimage.png" />

- это то, что нужно отобразить в браузере, и поэтому вам нужно обмануть веб-сервер, чтобы он взял URL-адрес запроса

http://localhost/article/8AB98/myimage.png

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

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

Вариант 1 - Редактор URL

Купите копию ISAPI_Rewrite и переписайте все URL-адреса, соответствующие вышеуказанным критериям, чтобы они получили изображение где бы он ни жил. Подробнее об ISAPI_Rewrite здесь .

Вариант 2 - Пользовательский HttpHandler

Вы можете написать HttpHandler, сопоставленный со всеми запросами файлов PNG, который анализирует URL-адрес запроса и выполняет необходимые действия для поиска изображения, а затем возвращает его в поток ответов. Обратной стороной этого является то, что вам придется указать IIS сопоставить все запросы PNG для прохождения aspnet_isapi.dll, что может снизить производительность.

Я все еще не уверен, правильно ли я понимаю вашу проблему, но надеюсь это помогает. Удачи.

5
ответ дан 9 December 2019 в 22:38
поделиться

Люди (и особенно новички) никогда не должны использовать scanf ("% s") или gets () или любые другие другие функции, которые не имеют защиты от переполнения буфера, если вы не знаете наверняка, что ввод всегда будет иметь определенный формат (и, возможно, даже не тогда).

Помните, что scanf означает «сканирование отформатировано. "и очень мало меньше форматированных, чем данные, введенные пользователем. Это идеально, если вы полностью контролируете формат входных данных, но обычно не подходит для ввода пользователем.

Используйте fgets () (который имеет защиту от переполнения буфера), чтобы ввести ваш ввод в строка и sscanf () для ее оценки. Поскольку вам просто нужно то, что пользователь ввел без синтаксического анализа, вы не

6
ответ дан 9 December 2019 в 22:38
поделиться

В итоге я использовал решение @ thinkzig, хотя и немного по-другому. Используя FileContent из сборки MVC Futures, я просто добавил еще один маршрут для обработки изображений.

routes.MapRoute("Image", "article/{id}/{image}", new { controller = "Article", action = "Image" });
routes.MapRoute("Article", "article/{id}", new { controller = "Article", action = "Index" });

Этот новый метод действия просто конструирует путь к файлу на основе идентификатора статьи и имени изображения:

public ActionResult Image(string id, string image)
{
    string articlePath = Server.MapPath("~/views/article/");
    string filePath = Path.Combine(articlePath, string.Format("{0}/{1}", id, image));
    return this.File(filePath, "image");
}

Была еще одна мелочь, с которой мне пришлось столкнуться с. Если пользователь обращается к статье без косой черты в конце ( http: // localhost / article / 8AB98 ), тогда браузер считает, что articleID является файлом, и пытается найти неправильная папка с изображением ( http: //localhost/article/img.png ).

К счастью, в этом случае mvc направляет запрос к действию Article с именем изображения в качестве параметра "id", так что я могу просто искать "." в идентификаторе, а затем используйте обычное действие Image для его обработки.

в действии статьи:

if (id.Contains("."))
{
    return RedirectToImage(id);
}

И затем код перенаправления на изображение, который определяет идентификатор и имя файла

private ActionResult RedirectToImage(string id)
{
    if (Request.UrlReferrer == null)
    {
        return Content("invalid request");
    }

    var referrer = Request.UrlReferrer.ToString();
    if (referrer.Contains("?"))
    {
        referrer = referrer.Split('?')[0];
    }

    var realId = Path.GetFileName(referrer);
    return this.Image(realId, id);
}

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

Если пользователь пытается щелкнуть изображение правой кнопкой мыши (при просмотре без косой черты) и выбирает «открыть изображение в новой вкладке», то у меня нет возможности узнать идентификатор статьи, поэтому я просто возвращаю «недействительный запрос». строка для пользователя. Это нормально, потому что я на самом деле не пытаюсь поддерживать этих пользователей в такой ситуации: -)

Если пользователь пытается щелкнуть изображение правой кнопкой мыши (при просмотре без косой черты) и выбирает «открыть изображение в новой вкладке», то у меня нет возможности узнать идентификатор статьи, поэтому я просто возвращаю «недействительный запрос». строка для пользователя. Это нормально, потому что я на самом деле не пытаюсь поддерживать этих пользователей в такой ситуации: -)

-1
ответ дан 9 December 2019 в 22:38
поделиться

Один из способов сделать это - добавить IgnoreRoute для файлов изображений:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("article/{ArticleID}/{name}.png");
    ...
1
ответ дан 9 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: