php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.01.2009, 12:03  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

8k? Dann fehlt da wohl einiges

Code:
Imports System.IO
Imports System.Net
Imports System.Collections.Generic
Imports System.Text

Module Module1
	Class Foo	' Zum Debuggen
		Protected mWritten As Long
		Protected mStream As Stream
		Public Sub New(ByVal target As Stream)
			mStream = target
			mWritten = 0
		End Sub
		Public Sub Write(ByRef buffer() As Byte, ByVal offset As Integer, ByVal count As Integer)
			mStream.Write(buffer, offset, count)
			mWritten += count
			' Debug.Write(Encoding.ASCII.GetString(buffer, 0, buffer.Length))
		End Sub
		Public Sub Close()
			mStream.Close()
		End Sub
		Public ReadOnly Property Length()
			Get
				Return mWritten
			End Get
		End Property
	End Class
	Class FileMimePart
		Public Shared BufferSize As Integer = 2048

		Dim mFilename As String
		Dim mElementname As String
		Dim mStream As FileStream
		Dim mStreamLength As Long
		Dim mHeader() As Byte = Nothing
		Public Sub New(ByVal filename As String, ByVal elementname As String)
			mStream = New FileStream(filename, FileMode.Open, FileAccess.Read)
			If False = mStream.CanSeek Then
				Throw New IOException("!stream.CanSeek")
			End If
			mStreamLength = mStream.Length
			mFilename = filename
			mElementname = elementname
			mHeader = createHeader()
		End Sub
		Public ReadOnly Property Length() As Long
			Get
				Return mHeader.Length + mStreamLength
			End Get
		End Property
		Public Function WriteTo(ByRef target As Foo) As Long
			Dim total As Long = 0
			Dim buffSize As Integer = CType(Math.Min(BufferSize, mStream.Length), Integer)
			Dim buffer(buffSize) As Byte
			Dim cbRead As Integer

			mStream.Position = 0
			Dim s As String = String.Format("WriteTo: filename={0} part-lenght={1:D} mLength={2:D} stream.length={3:D}", mFilename, Length, mStreamLength, mStream.Length)
			Debug.WriteLine(s)
			If mStreamLength <> mStream.Length Then
				Throw New IOException("file changed")
			End If

			target.Write(mHeader, 0, mHeader.Length)
			total += mHeader.Length
			cbRead = mStream.Read(buffer, 0, buffer.Length)
			While cbRead > 0
				target.Write(buffer, 0, cbRead)
				total += cbRead
				cbRead = mStream.Read(buffer, 0, buffer.Length)
			End While
			If total <> Length Then
				Throw New IOException("total <> Length")
			End If
			Return total
		End Function
		Protected Function createHeader() As Byte()
			Return Encoding.UTF8.GetBytes( _
			 "Content-Disposition: form-data; name=""" & mElementname & """; filename=""" & Path.GetFileName(mFilename) & """" & ControlChars.CrLf _
			 & "Content-Type: text/plain" & ControlChars.CrLf _
			 & ControlChars.CrLf _
			)
		End Function
	End Class
	Public Class FileUpload
		Dim mBoundary As String
		Dim mHeader() As Byte
		Dim mCrLf() As Byte
		Dim mFooter() As Byte

		Dim files As List(Of FileMimePart) = New List(Of FileMimePart)
		Public Sub New()
			mBoundary = "---------------------------" & Now.Ticks.ToString() & CType(Threading.Thread.CurrentThread.ManagedThreadId, String)
			mHeader = Encoding.ASCII.GetBytes("--" & mBoundary & ControlChars.CrLf)
			mCrLf = Encoding.ASCII.GetBytes(ControlChars.CrLf)
			mFooter = Encoding.ASCII.GetBytes("--" & mBoundary & "--" & ControlChars.CrLf)
		End Sub
		Public Sub AddFile(ByVal filename As String, ByVal elementname As String)
			files.Add(New FileMimePart(filename, elementname))
		End Sub
		Public Function SendTo(ByVal url As String) As HttpWebResponse
			Dim request As HttpWebRequest = HttpWebRequest.Create(url)
			request.AllowWriteStreamBuffering = True
			request.Method = "POST"
			request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 (.NET CLR 3.5.30729)"
			request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"

			request.ContentType = "multipart/form-data; boundary=" & mBoundary
			request.ContentLength = ContentLength

			Debug.WriteLine("request.ContentLength=" & request.ContentLength.ToString())

			Dim stream As Foo = New Foo(request.GetRequestStream())
			For Each fmp As FileMimePart In files
				stream.Write(mHeader, 0, mHeader.Length)
				fmp.WriteTo(stream)
				stream.Write(mCrLf, 0, mCrLf.Length)
			Next
			stream.Write(mFooter, 0, mFooter.Length)

			Dim dbgWritten = stream.Length
			stream.Close()
			Return CType(request.GetResponse(), HttpWebResponse)
		End Function
		Public ReadOnly Property ContentLength() As Long
			Get
				Dim length As Integer = 0
				For Each fmp As FileMimePart In files
					length += mHeader.Length + fmp.Length + mCrLf.Length
				Next
				length += mFooter.Length
				Return length
			End Get
		End Property
	End Class
	Function getFirstStorageCardPath()
		Dim sPath As String = ""
		Dim attrStorageCard As FileAttributes = FileAttributes.Directory Or FileAttributes.Temporary
		Dim root As DirectoryInfo = New DirectoryInfo("\")
		For Each fsi As FileSystemInfo In root.GetFileSystemInfos()
			If attrStorageCard = (fsi.Attributes And attrStorageCard) Then
				sPath = fsi.FullName
				Exit For
			End If
		Next
		Return sPath
	End Function
	Sub Stream2DebugConsole(ByVal source As Stream)
		Dim buffer(8192) As Byte
		Dim cbRead As Integer

		Debug.WriteLine(ControlChars.CrLf & "stream:")
		cbRead = source.Read(buffer, 0, buffer.Length)
		While cbRead > 0
			Debug.Write(Encoding.ASCII.GetString(buffer, 0, cbRead))
			cbRead = source.Read(buffer, 0, buffer.Length)
		End While
		Debug.WriteLine(ControlChars.CrLf & "done.")
	End Sub


	Sub Main()
		System.Net.ServicePointManager.Expect100Continue = False
		Dim base As String = getFirstStorageCardPath()

		Dim upload As FileUpload = New FileUpload
		upload.AddFile(base & "\FileZilla_3.2.0_win32-setup.exe", "file1")
		upload.AddFile(base & "\php-5.2.6.tar.bz2", "file2")
		Dim response As HttpWebResponse = upload.SendTo("http://10.0.10.1/test.php")
		Dim rstream As Stream = response.GetResponseStream()
		Stream2DebugConsole(rstream)

		Return
	End Sub
End Module
edit: Es geht mir um diesen (geänderten)Teil:
Code:
Public Function WriteTo(ByRef target As Foo) As Long
			Dim total As Long = 0
			Dim buffSize As Integer = CType(Math.Min(BufferSize, mStream.Length), Integer)
			Dim buffer(buffSize) As Byte
			Dim cbRead As Integer

			mStream.Position = 0
			Dim s As String = String.Format("WriteTo: filename={0} part-lenght={1:D} mLength={2:D} stream.length={3:D}", mFilename, Length, mStreamLength, mStream.Length)
			Debug.WriteLine(s)
			If mStreamLength <> mStream.Length Then
				Throw New IOException("file changed")
			End If

			target.Write(mHeader, 0, mHeader.Length)
			total += mHeader.Length
			cbRead = mStream.Read(buffer, 0, buffer.Length)
			While cbRead > 0
				target.Write(buffer, 0, cbRead)
				total += cbRead
				cbRead = mStream.Read(buffer, 0, buffer.Length)
			End While
			If total <> Length Then
				Throw New IOException("total <> Length")
			End If
			Return total
		End Function

Geändert von David (27.01.2009 um 12:13 Uhr).
David ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.01.2009, 12:27  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Das wirft mir die "file changed"-Exception

EDIT: Sorry, hast ja noch mehr geändert, moment...
cycap ist offline  
Alt 27.01.2009, 12:35  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Code:
request.ContentLength=538
Eine Ausnahme (erste Chance) des Typs "System.UriFormatException" ist in System.dll aufgetreten.
WriteTo: filename=\bt_bspc.bmp part-lenght=414 mLength=316 stream.length=316

stream:
_FILES=array(0) {
}


done.
zum verrückt werden
cycap ist offline  
Alt 27.01.2009, 13:04  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Bitte mal ohne Änderungen außer an Dim url As String = "http://10.0.10.1/test.php" ausführen:
(benötigt Windows.Forms für MessageBox.Show)
Code:
Imports System.IO
Imports System.Net
Imports System.Collections.Generic
Imports System.Text

Module Module1
  Class Foo  ' Zum Debuggen
    Protected mWritten As Long
    Protected mStream As Stream
    Public Sub New(ByVal target As Stream)
      mStream = target
      mWritten = 0
    End Sub
    Public Sub Write(ByRef buffer() As Byte, ByVal offset As Integer, ByVal count As Integer)
      mStream.Write(buffer, offset, count)
      mWritten += count
      ' Debug.Write(Encoding.ASCII.GetString(buffer, 0, buffer.Length))
    End Sub
    Public Sub Close()
      mStream.Close()
    End Sub
    Public ReadOnly Property Length()
      Get
        Return mWritten
      End Get
    End Property
  End Class
  Class FileMimePart
    Public Shared BufferSize As Integer = 2048

    Dim mFilename As String
    Dim mElementname As String
    Dim mStream As FileStream
    Dim mStreamLength As Long
    Dim mHeader() As Byte = Nothing
    Public Sub New(ByVal filename As String, ByVal elementname As String)
      mStream = New FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)
      If False = mStream.CanSeek Then
        Throw New IOException("!stream.CanSeek")
      End If
      mStreamLength = mStream.Length
      mFilename = filename
      mElementname = elementname
      mHeader = createHeader()
    End Sub
    Public ReadOnly Property Length() As Long
      Get
        Return mHeader.Length + mStreamLength
      End Get
    End Property
    Public Function WriteTo(ByRef target As Foo) As Long
      Dim total As Long = 0
      Dim buffSize As Integer = CType(Math.Min(BufferSize, mStream.Length), Integer)
      Dim buffer(buffSize) As Byte
      Dim cbRead As Integer

      mStream.Position = 0
      Dim s As String = String.Format("WriteTo: filename={0} part-lenght={1:D} mLength={2:D} stream.length={3:D}", mFilename, Length, mStreamLength, mStream.Length)
      Debug.WriteLine(s)
      If mStreamLength <> mStream.Length Then
        Throw New IOException("file changed")
      End If

      target.Write(mHeader, 0, mHeader.Length)
      total += mHeader.Length
      cbRead = mStream.Read(buffer, 0, buffer.Length)
      While cbRead > 0
        target.Write(buffer, 0, cbRead)
        total += cbRead
        cbRead = mStream.Read(buffer, 0, buffer.Length)
      End While
      If total <> Length Then
        Throw New IOException("total <> Length")
      End If
      Return total
    End Function
    Protected Function createHeader() As Byte()
      Return Encoding.UTF8.GetBytes( _
       "Content-Disposition: form-data; name=""" & mElementname & """; filename=""" & Path.GetFileName(mFilename) & """" & ControlChars.CrLf _
       & "Content-Type: application/octet-stream" & ControlChars.CrLf _
       & ControlChars.CrLf _
      )
    End Function
  End Class
  Public Class FileUpload
    Dim mBoundary As String
    Dim mHeader() As Byte
    Dim mCrLf() As Byte
    Dim mFooter() As Byte

    Dim files As List(Of FileMimePart) = New List(Of FileMimePart)
    Public Sub New()
      mBoundary = "---------------------------" & Now.Ticks.ToString() & CType(Threading.Thread.CurrentThread.ManagedThreadId, String)
      mHeader = Encoding.ASCII.GetBytes("--" & mBoundary & ControlChars.CrLf)
      mCrLf = Encoding.ASCII.GetBytes(ControlChars.CrLf)
      mFooter = Encoding.ASCII.GetBytes("--" & mBoundary & "--" & ControlChars.CrLf)
    End Sub
    Public Sub AddFile(ByVal filename As String, ByVal elementname As String)
      files.Add(New FileMimePart(filename, elementname))
    End Sub
    Public Function SendTo(ByVal url As String) As HttpWebResponse
      Dim request As HttpWebRequest = HttpWebRequest.Create(url)
      request.AllowWriteStreamBuffering = True
      request.Method = "POST"
      request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 (.NET CLR 3.5.30729)"
      request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"

      request.ContentType = "multipart/form-data; boundary=" & mBoundary
      request.ContentLength = ContentLength

      Debug.WriteLine("request.ContentLength=" & request.ContentLength.ToString())

      Dim stream As Foo = New Foo(request.GetRequestStream())
      For Each fmp As FileMimePart In files
        stream.Write(mHeader, 0, mHeader.Length)
        fmp.WriteTo(stream)
        stream.Write(mCrLf, 0, mCrLf.Length)
      Next
      stream.Write(mFooter, 0, mFooter.Length)

      Dim dbgWritten = stream.Length
      stream.Close()
      Return CType(request.GetResponse(), HttpWebResponse)
    End Function
    Public ReadOnly Property ContentLength() As Long
      Get
        Dim length As Integer = 0
        For Each fmp As FileMimePart In files
          length += mHeader.Length + fmp.Length + mCrLf.Length
        Next
        length += mFooter.Length
        Return length
      End Get
    End Property
  End Class
  Function getFirstStorageCardPath()
    Dim sPath As String = ""
    Dim attrStorageCard As FileAttributes = FileAttributes.Directory Or FileAttributes.Temporary
    Dim root As DirectoryInfo = New DirectoryInfo("\")
    For Each fsi As FileSystemInfo In root.GetFileSystemInfos()
      If attrStorageCard = (fsi.Attributes And attrStorageCard) Then
        sPath = fsi.FullName
        Exit For
      End If
    Next
    Return sPath
  End Function
  Sub Stream2DebugConsole(ByVal source As Stream)
    Dim buffer(8192) As Byte
    Dim cbRead As Integer

    Debug.WriteLine(ControlChars.CrLf & "stream:")
    cbRead = source.Read(buffer, 0, buffer.Length)
    While cbRead > 0
      Debug.Write(Encoding.ASCII.GetString(buffer, 0, cbRead))
      cbRead = source.Read(buffer, 0, buffer.Length)
    End While
    Debug.WriteLine(ControlChars.CrLf & "done.")
  End Sub
  Sub CreateUploadFile(ByVal path As String)
    Dim f As StreamWriter = New StreamWriter(New FileStream(path, FileMode.Create, FileAccess.ReadWrite))
    For i As Integer = 1 To 20
      f.WriteLine(i)
    Next
    f.Flush()
    f.Dispose()
  End Sub

  Sub Main()
    Try
      Dim url As String = "http://10.0.10.1/test.php"

      System.Net.ServicePointManager.Expect100Continue = False
      Dim path As String = getFirstStorageCardPath()
      If 1 > path.Length Then
        Throw New IOException("no storage card")
      End If
      path &= "\test.txt"
      CreateUploadFile(path)

      Dim upload As FileUpload = New FileUpload
      upload.AddFile(path, "file1")
      ' upload.AddFile(base & "\php-5.2.6.tar.bz2", "file2")
      Dim response As HttpWebResponse = upload.SendTo(url)
      Dim rstream As Stream = response.GetResponseStream()
      ' Stream2DebugConsole(rstream)
      Dim outLength As Integer
      Dim bufferOut(256) As Byte
      outLength = rstream.Read(bufferOut, 0, bufferOut.Length)
      System.Windows.Forms.MessageBox.Show(Encoding.ASCII.GetString(bufferOut, 0, outLength), "Response")
    Catch ex As Exception
      System.Windows.Forms.MessageBox.Show(ex.Message, "Exception")
    End Try
    Return
  End Sub
End Module
David ist offline  
Alt 27.01.2009, 13:21  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Hab deinen Code jetzt in ein neues Smartdevice-Konsolenprojekt eingefügt und bekomme die "no storage card"-Exception.

Geändert habe ich nur die Ziel-Url und

Code:
            MsgBox(Encoding.ASCII.GetString(bufferOut, 0, outLength), , "Response")
        Catch ex As Exception
            MsgBox(ex.Message, , "Exception")
Debug-Ausgabe:

Code:
Eine Ausnahme (erste Chance) des Typs "System.IO.IOException" ist in SmartDeviceProject1.exe aufgetreten.
cycap ist offline  
Alt 27.01.2009, 16:22  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Oops, ich war davon ausgegangen, dass Du einen Shared Folder im Emulator benutzt.
Einfach falsch erinnert an:
Zitat:
Zitat von cycap Beitrag anzeigen
ich kann da aber auch WM6-Device angeben und nen MDA Compact III an den USB hängen, dann debuggt er darauf, meinste dabei kommt was anderes raus
Das letzte Programm versucht selbst eine kleine textdatei anzulegen und diese dann hoch zu laden. Einfach nur um zu gucken, ob Du immer noch das Problem mit den geöffneten Dateien hast.


Das Verzeichnis wird dann als Storage Card in den Emulator eingebunden. Ist vielleicht ganz praktisch, wenn Du mal größere Datenmengen auf den Pocket PC übertragen willst (und erspart mir jetzt, das Ding auf SpecialFolders umzuschreiben ).
David ist offline  
Alt 27.01.2009, 16:26  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Ich hab ja schon ne Download-Funktion die speichert alles erstma im Hauptverzeichnis (also \ ) und von da lad ichs auch wieder hoch, aber das ist ja nicht das Problem. Wenn ich die Exception auskommentiere, dann bekomm ich wieder nen leeres Array ausgegeben.
cycap ist offline  
Alt 27.01.2009, 16:29  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Hm, sehr seltsam. Ich kann es einfach nicht reproduzieren. Egal, was ich von wo nach wo übertragen lassen, es funktioniert oder es ist zu wenig Speicher da.
David ist offline  
Alt 27.01.2009, 16:33  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Wie gesagt, hab deinen Code kopiert und in ein nagelneues Projekt eingefügt... kannst du mal versuchen was an meinen Server zu schicken? Ich würd dir die URL dann per PN schicken...
cycap ist offline  
Alt 27.01.2009, 16:36  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Dann muss ich
a) die PN wieder aktivieren
b) den Pocket PC ins "echte" Netz lassen
Das kann etwas dauern
David ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem mit File Upload b++ PHP Tipps 2006 2 26.04.2006 20:35
File Upload tomtaz PHP Tipps 2006 1 19.04.2006 14:58
file upload & bilder resize PHP Tipps 2006 3 15.02.2006 18:56
File Upload für dateien größer als 1GB b++ PHP Tipps 2006 14 08.02.2006 21:59
File Upload mit mehreren Files PHP-Fortgeschrittene 16 16.01.2006 12:07
Problem mit File Upload PHP Tipps 2007 3 06.11.2005 23:39
File Upload - während upload vorgang anmiertes gif PHP-Fortgeschrittene 4 20.10.2005 18:13
File Upload Server, Hosting und Workstations 2 24.05.2005 17:07
update auf php 5.0.4 robo47 Server, Hosting und Workstations 6 10.04.2005 19:00
file upload + und pic gleichzeitig verkleinern PHP Tipps 2004-2 3 16.12.2004 08:09
Problem mit File Upload PHP Tipps 2004-2 2 19.11.2004 13:41
[Erledigt] file upload PHP-Fortgeschrittene 4 29.10.2004 13:07
HTML File Upload HTML, Usability und Barrierefreiheit 4 14.09.2004 15:23
File upload PHP-Fortgeschrittene 3 23.08.2004 17:16
[Erledigt] File Upload: PRoblem mit Upload directory PHP Tipps 2004 3 26.06.2004 13:20

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
eine ausnahme (erste chance) des typs \system.io.ioexception\ ist in system.dll aufgetreten., getfilesysteminfo wirft fehler, eine ausnahme (erste chance) des typs \system.uriformatexception\ ist in system.dll aufgetreten., fehler start gecko.exe ioexception, \eine ausnahme (erste chance) des typs \system.io.ioexception\ ist in system.dll aufgetreten.\, eine ausnahme (erste chance) des typs \system.io.ioexception\ ist in system.xml.dll aufgetreten., \eine ausnahme (erste chance) des typs \system.io.ioexception\ ist in system.dll aufgetreten\, encoding.ascii.getbytes fileupload

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:09 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum