Как избежать протокола file: // и показывать изображения, используя http: // - PullRequest
0 голосов
/ 05 января 2012

Кажется, мы не можем отображать изображения в Google Chrome, используя file: // protocol .

Я думаю, было бы неплохо иметь способ загрузить файл в удаленной сети, такой как file://my-network-computer/my-folder/my-file.jpg, и отобразить его как изображение на странице asp.net.

Можно ли загрузить байты из файла на сетевом диске, а затем отобразить его содержимое в виде изображения на странице asp.net?

Ответы [ 2 ]

2 голосов
/ 06 января 2012

Вы можете написать обработчик, который открывает файл в сети, используя его UNC-путь, и записывает его содержимое в ответ, используя Response.WriteFile:

<%@ WebHandler Language="C#" Class="Handler" %>

using System.IO;

public class NetworkImageHandler : System.Web.IHttpHandler
{
  // Folder where all images are stored, process must have read access
  private const string NETWORK_SHARE = @"\\computer\share\";

  public void ProcessRequest(HttpContext context)
  {
      string fileName = context.Request.QueryString["file"];
      // Check for null or empty fileName
      // Check that this is only a file name, and not 
      // something like "../../accounting/budget.xlsx"
      // Check that the file extension is valid

      string path = Path.Combine(NETWORK_SHARE, fileName);
      // Check if the file exists

      context.Response.ContentType = "image/jpg";
      context.Response.WriteFile(path, true);
  }

  public bool IsReusable { get { return false; } }
}

Затем вы устанавливаетеimage src к URL-адресу обработчика:

<asp:Image runat="server" ImageUrl="~/NetworkImageHandler.ashx?file=file.jpg" />

Будьте очень строги в проверке ввода, не создавайте обработчик, который позволил бы кому-то открыть только любой файл в вашей сети ,Ограничьте доступ к одной папке, только предоставьте рабочему процессу доступ к этой папке и проверьте допустимые расширения файлов (например, jpg, jpeg, png, gif).

Это довольно простой пример, донне используйте его в производственном процессе без тестирования.

Альтернативные способы записи содержимого в ответ и пример кода см .:

1 голос
/ 05 января 2012

Да, это возможно.

Вы можете преобразовать байты в строку base64 и установить для src изображения значение строки base64.

Пример:

<img src="data:image/gif;base64,R0lGODlhDwAPAKECAAAAzMzM/////
wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4ML
wWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw=="
alt="Base64 encoded image" width="150" height="150"/>

И способ преобразования байтов в строку base64:

 base64String = System.Convert.ToBase64String(binaryData, 
                            0,
                            binaryData.Length);
...