Image.FromFile "Файл не найден", когда файл там - PullRequest
0 голосов
/ 21 октября 2019

У меня есть файл, хранящийся в каталоге на моем сайте. Когда я пытаюсь получить доступ к файлу с помощью image.fromfile, выдается исключение, говорящее, что файла там нет. Однако, когда я обращаюсь к тому же файлу, используя тот же путь, но загружая его в элемент управления изображением, изображение загружается безошибочно, проверяя, что оно там есть.

Код, который выбрасывает исключение для файла, не найденного:

Private Sub btnCombine_Click(sender As Object, e As EventArgs) Handles btnCombine.Click
    Dim BMCanvas As Bitmap     'the "canvas" to draw on
    Dim BackgroundTemplate As Image     'the background image


    Dim img1Overlay As Bitmap   'the character image

    BackgroundTemplate = Image.FromFile("~/Account/Images/Blue 1-02.jpg")   'Template Background Image
    img1Overlay = Image.FromStream(FileUpload1.FileContent)  'First overlay image

    BMCanvas = New Bitmap(500, 647)    'new canvas
    Using g As Graphics = Graphics.FromImage(BMCanvas)
        g.DrawImage(BackgroundTemplate, 0, 0, 500, 647)  'Fill the convas with the background image
        g.DrawImage(img1Overlay, 50, 50, 100, 100)  'Insert the overlay image onto the background image
    End Using

    'Setup a path to the destination for the composite image
    Dim folderPath As String = Server.MapPath("~/OutFiles/")

    'Create a directory to store the composite image if it does not already exist.
    If Not Directory.Exists(folderPath) Then
        'If Directory (Folder) does not exists Create it.
        Directory.CreateDirectory(folderPath)
    End If

    'Temporarily save the file as jpeg.
    BMCanvas.Save(folderPath & "Temp1.jpg", Imaging.ImageFormat.Jpeg)


    'View the resulting composite image in image control.
    Image1.ImageUrl = folderPath & "Temp1.jpg"

    BMCanvas.Dispose()
End Sub

И код, который проверяет, что изображение фактически находится в каталоге и успешно отображает изображение:

Private Sub cboRole_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRole.SelectedIndexChanged
    If cboRole.SelectedIndex = 1 Then
        Image1.ImageUrl = "~/Account/Images/Blue 1-02.jpg"
    End If
End Sub

Я не могу понять, почему один способ работает, а другойпуть не дает.

Я также безуспешно пробовал следующий код:

    'Another way to read the image files
    Image = File.ReadAllBytes(Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "~/Account/Images/Blue 1-02.jpg")))

Ответы [ 2 ]

1 голос
/ 21 октября 2019

ОК, ответ на вторую часть вашего вопроса («Почему он работает с ImageUrl?») Находится в документации

Цитата:

Используйте свойство ImageUrl, чтобы указать URL-адрес изображения для отображения в элементе управления изображения. Вы можете использовать относительный или абсолютный URL. Относительный URL-адрес связывает местоположение изображения с местоположением веб-страницы без указания полного пути на сервере. Путь относительно местоположения веб-страницы. Это облегчает перемещение всего сайта в другой каталог на сервере без обновления кода. Абсолютный URL обеспечивает полный путь, поэтому перемещение сайта в другой каталог требует обновления кода.

В него (элемент управления изображением) уже встроена функция «Сопоставление» пути относительно вашегопапка веб-страницы.

При использовании пути изнутри вашего кода без элементов управления, как в Image.FromFile, необходимо убедиться, что путь правильно сопоставлен, используя Server.MapPath

Как вы уже сделали в своем коде для создания каталога.

0 голосов
/ 22 октября 2019

Вы не можете иметь изображение с относительного URL. Чтобы получить изображение в виде System.Drawing.Image, вам нужно получить его по физическому пути, как этот (в вашем случае)

 Dim image As System.Drawing.Image = System.Drawing.Image.FromFile(HttpContext.Current.Request.PhysicalApplicationPath & "\Account\Images\Blue 1-02.jpg") 'Server.MapPath("~/Account/Images/Blue 1-02.jpg")) 
...