当文件存在时Image.FromFile“找不到文件”

时间:2019-10-21 18:16:45

标签: asp.net vb.net system.drawing.imaging

我的文件存储在站点内的目录中。当我尝试使用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 个答案:

答案 0 :(得分:1)

好的,问题第二部分(“为什么它与ImageUrl一起工作?”)的答案位于documentation

报价:

  

使用ImageUrl属性指定要显示在其中的图像的URL   图像控件。您可以使用相对或绝对URL。一种   相对网址将图片的位置与   未在服务器上指定完整路径的网页。路径是   相对于网页的位置。这使得移动起来更容易   将整个站点复制到服务器上的另一个目录,而无需更新   代码。绝对网址提供了完整的路径,因此移动   网站到另一个目录要求您更新代码。

它(图像控件)已经具有相对于您的网页文件夹“映射”路径的嵌入式功能。

在代码中使用路径时,如Image.FromFile中那样,在没有控件的情况下,您需要使用Server.MapPath

确保路径已正确映射

就像您在用于创建目录的代码中所做的那样。

答案 1 :(得分:0)

您不能从相对网址获得图片。 要将您的图片作为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"))