Как избежать протокола file:// и показывать изображения, используя http://
Кажется, мы не можем показывать изображения в Google Chrome, используя протокол file://.
Я думаю, было бы неплохо иметь способ загрузить файл в удаленной сети, такой как file://my-network-computer/my-folder/my-file.jpg
и отрендерить его как изображение на странице asp.net.
Можно ли загрузить байты из файла на сетевом диске, а затем отобразить его содержимое в виде изображения на странице asp.net?
2 ответа
Вы можете написать обработчик, который открывает файл в сети, используя его 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; } }
}
Затем вы устанавливаете изображение src
к URL обработчика:
<asp:Image runat="server" ImageUrl="~/NetworkImageHandler.ashx?file=file.jpg" />
Будьте очень строги в проверке ввода, не создавайте обработчик, который позволил бы кому-либо открыть любой файл в вашей сети. Ограничьте доступ к одной папке, только предоставьте рабочему процессу доступ к этой папке и проверьте допустимые расширения файлов (например, jpg, jpeg, png, gif).
Это довольно простой пример, не используйте его в производстве без тестирования.
Альтернативные способы записи содержимого в ответ и пример кода см.:
Да, это возможно.
Вы можете преобразовать байты в строку 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);