Jag har ett galleri där jag vill kunna ta bort bilder.
Att ta bort sökvägen i databasen är inga problem men det strular lite när jag ska ta bort själva filen.
felmeddelande:
"Processen kan inte komma åt filen ...blabla\ormar\02.jpg eftersom den används i en annan process"
så jag undrar hur man stänger filen, eller alternativt om det finns en smidigare lösning?
sub btnDelete_Click(Sender as object, e as DataListCommandEventArgs)
Dim Id As String = CType(e.Item.FindControl("ImageID"), Label).Text
Dim TempDir As String = CType(e.Item.FindControl("ImageLocation"), Label).Text
Dim FileName As String = CType(e.Item.FindControl("ImageUrl"), Label).Text
TempDir = TempDir & FileName
TempDir = Server.MapPath(TempDir)
' Delete the file.
File.Delete(TempDir)
Dim strSQL4 As String = "DELETE * FROM images WHERE image_ID = " & Id
Try
Dim myCommand4 As New OleDbCommand(strSQL4, myConnection)
myConnection.Open()
Dim numRowsAffected As Integer = 0
numRowsAffected = myCommand4.ExecuteNonQuery()
myConnection.Close()
If numRowsAffected <> 0 Then
lblMessage.Text = "Bilden " & FileName & " har nu tagits bort!"
Else
lblMessage.Text = "Bilden " & FileName & " kunde INTE tas bort!"
End If
ImageDataList.EditItemIndex = -1
FillDataList()
Catch ex As Exception
'# Errorhantering, logga felmeddelande !!
lblMessage.Text = ex.Message
End Try
End Sub
nej f*n.. jag klarar inte av det här..
lägger upp mer av koden och hoppas att ngn kan hjälpa mig..
såg att icaac haft (ungefär) samma promlem. i den här tråden
jag har försökt lite med .collect men får det inte att funka pga sättet som min bildvisning är uppbyggd (det är inte jag som gjort grunden)
thumbview.aspx gör bilderna små i datalist'en.
bildgalleri.aspx
Protected Function GetImageName(ByVal image_url As String)
Dim myConnection1 As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Server.MapPath("db/images.mdb"))
Dim strFileNameOnly As String = System.IO.Path.GetFileName(image_url)
Dim strSQL1 As String = "SELECT image_location FROM images WHERE image_url =" & "'" & strFileNameOnly & "'"
Dim myCommand1 As New OleDb.OleDbCommand(strSQL1, myConnection1)
myConnection1.Open()
Dim strLocationOnly As String = myCommand1.ExecuteScalar()
myConnection1.Close()
strFileNameOnly = strLocationOnly & strFileNameOnly
Return strFileNameOnly
End Function
'********************
sub btnDelete_Click(Sender as object, e as DataListCommandEventArgs)
Dim Id As String = CType(e.Item.FindControl("ImageID"), Label).Text
Dim TempDir As String = CType(e.Item.FindControl("ImageLocation"), Label).Text
Dim FileName As String = CType(e.Item.FindControl("ImageUrl"), Label).Text
TempDir = TempDir & FileName
TempDir = Server.MapPath(TempDir)
Dim strSQL4 As String = "DELETE * FROM images WHERE image_ID = " & Id
Try
Dim myCommand4 As New OleDbCommand(strSQL4, myConnection)
myConnection.Open()
Dim numRowsAffected As Integer = 0
numRowsAffected = myCommand4.ExecuteNonQuery()
myConnection.Close()
If numRowsAffected <> 0 Then
lblMessage.Text = "Bilden " & FileName & " har nu tagits bort!"
Else
lblMessage.Text = "Bilden " & FileName & " kunde INTE tas bort!"
End If
ImageDataList.EditItemIndex = -1
FillDataList()
Catch ex As Exception
'# Errorhantering, logga felmeddelande !!
lblMessage.Text = ex.Message
Finally
'fullSizeImg.Collect()
'GC.Collect()
'Delete the file.
File.Delete(TempDir)
End Try
End Sub
---------------------------------------------------
<img src='thumbview.aspx?img_name=<%#GetImageName(DataBinder.Eval(Container.DataItem, "image_url").ToString())%>'>
thumbview.aspx
<%@ Page Language="vb" debug="true" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<%@ import Namespace="System.Drawing.Imaging" %>
<script runat="server">
'#*****************************************************************
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
'#Hämta namnet på bilden
Dim imageUrl As String = Request.QueryString("img_name")
'#Lägg till hela sökvägen till filen
imageUrl = Server.MapPath(imageUrl)
dim fullSizeImg As System.Drawing.Image
dim thumbNailImg As System.Drawing.Image
'#Öppna bilden. Kan egentligen behövas try-catch här
fullSizeImg = System.Drawing.Image.FromFile(imageUrl)
'#Bilderna kan vara i två format 3:4 eller 4:3
If fullSizeImg.Height < fullSizeImg.Width Then
thumbNailImg = fullSizeImg.GetThumbnailImage(100, 75, Nothing, IntPtr.Zero)
Else
thumbNailImg = fullSizeImg.GetThumbnailImage(75, 100, Nothing, IntPtr.Zero)
End If
'#Eftersom jag bara tillåter JPEG eller GIF:
If fullSizeImg.RawFormat.Equals(ImageFormat.Jpeg) Then
Response.ContentType = "image/jpeg"
thumbNailImg.Save(Response.OutputStream, ImageFormat.Jpeg)
Else If fullSizeImg.RawFormat.Equals(ImageFormat.Gif) Then
Response.ContentType = "image/gif"
thumbNailImg.Save(Response.OutputStream, ImageFormat.Gif)
Else
'#Varken gif eller jpeg
Response.End()
End If
'fullSizeImg.Collect()
End Sub
'#*****************************************************************
</script>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Thumbview</title>
</head>
<body>
<form id="Form1" enctype="multipart/form-data" method="post" runat="server">
</form>
</body>
</html>
nej f*n.. jag klarar inte av det här..
jag har försökt lite med .collect men får det inte att funka pga sättet som min bildvisning är uppbyggd (det är inte jag som gjort grunden)
Image-objektet har ingen metod som heter collect.
Gör som jag sa och använd Dispose.
När du anropar metoden Dispose så frigörs resurserna som Image-objektet använde. Du behöver inte göra någon garbage collect efter det, det är bara onödigt. Systemet är oftast mycket bättre än du på att välja en lämplig tidpunkt för det.
using(Image image = Image.FromFile(path))
{
// gör det man vill med bilden
}
// Dispose körs för image.
I VB finns det ingen direkt motsvarighet (tror det kommer i v2) men det går att använda ett try ... finally block för att se till att objektet alltid disposas även vid exceptions.
När du anropar metoden Dispose så frigörs resurserna som Image-objektet använde. Du behöver inte göra någon garbage collect efter det, det är bara onödigt. Systemet är oftast mycket bättre än du på att välja en lämplig tidpunkt för det.
kan du visa var jag ska använda dispose?
det jag inte får till är att bilden ändras i en annan fil (thumbview.aspx). som sedan anropas av bildgalleri.aspx..
det är i bildgalleri.aspx som koden för att ta bort filen finns.