Bild Upload auf FTP, Fehler: Ausnahmefehler während einer Webclient-Anforderung

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von beaR.

    Bild Upload auf FTP, Fehler: Ausnahmefehler während einer Webclient-Anforderung

    Hallo miteinander,
    ich bin derzeit dabei, in meiner Software meinen Benutzern die Möglichkeit zu bieten, eigene Avatare hochzuladen. Jedoch funktioniert die ganze Geschichte nur so halb.

    Ziel ist es, dass die Nutzer jederzeit ihr Avatar mit maximal 1,30 MB in den Formaten JPG und PNG hochladen können.
    Nun stoße ich aber seit 2 Tagen auf das Problem, dass der Upload des Bildes nur mehr oder weniger funktioniert, sprich: Mal wird das Bild hochgeladen, mal wiederum nicht.

    Nun suche ich darum eure Hilfe, vorab der gesamte Code zum Bild auswählen, Bild-Size prüfen und Uploaden:

    Alle Definitionen:
    Textbox4 = vollständiger Lokaler Pfad zum Bild
    Button3 = Avatar hochladen
    Button4 = Bild auswählen
    PictureBox14 = GIF um Uploadvorgang darzustellen
    Label9 = Benutzername

    Alle Imports:
    Imports System.Net
    Imports System.ComponentModel
    Imports System.Windows.Forms



    Überprüfen ob Bild auf dem FTP existiert:
    Spoiler anzeigen

    Quellcode

    1. Public Function CheckIfFtpFileExistsImage(ByVal fileUri As String) As Boolean
    2. Dim request As FtpWebRequest = WebRequest.Create(fileUri)
    3. request.Credentials = New NetworkCredential("SERVER", "PASS")
    4. request.Method = WebRequestMethods.Ftp.GetFileSize
    5. Try
    6. Dim response As FtpWebResponse = request.GetResponse()
    7. ' THE FILE EXISTS
    8. Catch ex As WebException
    9. Dim response As FtpWebResponse = ex.Response
    10. If FtpStatusCode.ActionNotTakenFileUnavailable = response.StatusCode Then
    11. ' THE FILE DOES NOT EXIST
    12. Return False
    13. End If
    14. End Try
    15. Return True
    16. End Function


    Funktion um Bildgröße zu ermitteln:
    Spoiler anzeigen

    Quellcode

    1. Private Function getFileSize(filePath As String) As Long 'Größe checken
    2. Dim d = IO.File.Open(filePath, IO.FileMode.Open)
    3. Return d.Length
    4. d.Close()
    5. End Function



    Button4 (Bild auswählen, prüfen ob Datei über 1,30 MB)
    Spoiler anzeigen

    Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click 'Avatar auswählen und Größe checken....
    2. Using ofd As New OpenFileDialog
    3. With ofd
    4. .Title = "Avatar auswählen..."
    5. .InitialDirectory = (Environment.SpecialFolder.Desktop)
    6. .Filter = "Nur Bildformat PNG und JPG|*.png;*.jpg;*.jpeg"
    7. If .ShowDialog() = Windows.Forms.DialogResult.OK Then
    8. Me.TextBox4.Text = .FileName
    9. Dim fileSize = getFileSize(TextBox4.Text)
    10. If fileSize > 1373380L Then
    11. MsgBox("Avatar: " & TextBox4.Text & " überschreitet die maximale Dateigröße von 1,30 MB", MsgBoxStyle.Critical)
    12. TextBox4.Clear()
    13. Else
    14. 'nothing (Bild kleiner als 1,30 MB)
    15. End If
    16. Else : Me.TextBox4.Clear()
    17. End If
    18. End With
    19. End Using
    20. End Sub


    Button3 (Avatar hochladen):
    Spoiler anzeigen

    Quellcode

    1. 'Avatar hochladen...
    2. Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    3. If TextBox4.Text.Count = 0 Then
    4. MsgBox("Sie müssen ein Avatar auswählen", MsgBoxStyle.Critical)
    5. Else
    6. Select Case MsgBox("Sind Sie sicher, dass Sie das ausgewählte Avatar verwenden wollen?", vbQuestion Or vbYesNo Or vbDefaultButton2, "Bestätigung des folgenden Vorgangs benötigt")
    7. Case vbYes
    8. PictureBox14.Visible = True
    9. Button3.Enabled = False
    10. Button4.Enabled = False
    11. Await Task.Delay(200)
    12. 'Image
    13. If CheckIfFtpFileExistsImage("ftp://server.net/Benutzersoftware/benutzerinfo/" & Label9.Text & "/pic.png") Then
    14. Dim cred11 As NetworkCredential = New NetworkCredential("USER", "PASSWORD")
    15. Dim request11 As FtpWebRequest = FtpWebRequest.Create("ftp://server.net/Benutzersoftware/benutzerinfo/" & Label9.Text & "/pic.png")
    16. request11.Method = WebRequestMethods.Ftp.DeleteFile
    17. request11.Credentials = cred11
    18. Dim response11 As FtpWebResponse = request11.GetResponse()
    19. response11.Close()
    20. uploadFile()
    21. Else
    22. uploadFile()
    23. End If
    24. Case vbNo
    25. 'nothing
    26. End Select
    27. End If
    28. End Sub
    29. Private Async Sub uploadFile()
    30. Try
    31. Using w As New Net.WebClient
    32. w.Credentials = New Net.NetworkCredential("USER", "PASSWORD")
    33. Await w.UploadFileTaskAsync("ftp://server.net/Benutzersoftware/benutzerinfo/" & Label9.Text & "/pic.png", TextBox4.Text)
    34. UploadFileFinish()
    35. End Using
    36. Catch ex As Exception
    37. PictureBox14.Visible = False
    38. TextBox4.Clear()
    39. Button3.Enabled = True
    40. Button4.Enabled = True
    41. MessageBox.Show("Es ist ein Fehler beim Hochladen des Avatars aufgetreten: " & vbCrLf & vbCrLf & ex.Message, "Abbruch des Vorgangs", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    42. 'MsgBox("Es ist ein Fehler beim Hochladen des Avatars aufgetreten: " & vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.Critical)
    43. End Try
    44. End Sub
    45. Private Sub UploadFileFinish()
    46. PictureBox14.Visible = False
    47. Button3.Enabled = True
    48. Button4.Enabled = True
    49. TextBox4.Clear()
    50. If CheckIfFtpFileExistsImage("ftp://server.net/Benutzersoftware/benutzerinfo/" & Label9.Text & "/pic.png") Then
    51. PictureBox1.ImageLocation = "http://server.net/Benutzerdaten/Benutzersoftware/benutzerinfo/" & Label9.Text & "/pic.png"
    52. MessageBox.Show("Der ausgewählte Avatar wurde erfolgreich geändert", "Ändern erfolgreich", MessageBoxButtons.OK, MessageBoxIcon.Information)
    53. Else
    54. PictureBox1.Image = My.Resources._180x180_text
    55. End If
    56. End Sub
    57. End Class



    Nun das Problem: In dem Code von Button 3, die Zeile:
    Await w.UploadFileTaskAsync("ftp://server.net/Benutzersoftware/benutzerinfo/" & Label9.Text & "/pic.png", TextBox4.Text)

    Gibt er mir den Fehler aus:
    Ausnahmefehler während einer WebClient-Anforderung

    Der Pfad zum Bild existiert, der Link existiert und die Serverdaten sind auch richtig.
    Wie schon ganz oben beschrieben funktioniert es nur so halb, damit meine ich, dass er mir mal den Fehler ausgibt, und ein anderes mal wiederum nicht.

    Vielleicht habt ihr ja die Lösung, doch ich bin tatsächlich mit meinen Latein am Ende, probiere das mit dem Upload nun schon 2 Tage lang.

    LG, beaR

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Deine Software hat ein massives Sicherheitsproblem.
    Jeder User kann deine Ftp-Account-Daten rauskriegen, und kann dann mit deinem Webspace anfangen was er will.

    Weiters kann man die Kommunikation evtl. auch sniffen, und dann können auch externe Angreifer deinen Webspace übernehmen.

    Ftp muss sterben. Eiglich dürfte was anderes als SFtp garnet mehr erlaubt sein.
    @ErfinderDesRades Und was ist mit FTPS?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Wo? Ich sehe da immer noch SFTP, was über SSH läuft. FTPS ist FTP Secure, also FTP mit TLS-Verschlüsselung. Ich denke, dass Du das auch meinst.
    @beaR Wird das ein FTP-Chat?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    jo, thanks.
    Der Unterschied von SFTP und FTPS war mir garnet klar, und ich kann also nicht sagen, "was anneres als SFTP darfs net geben", sondern korrekter wäre: "Ftp sollte immer TLS-gesichert erfolgen - (egal wie's letztlich umgesetzt)".
    (Ist immer noch nicht ganz korrekt, weil kann ja auch andere sichere Übertragungen geben als TLS, aber das wird mir iwann zu spitzfindig.)
    Nein. Die Software ist für meinen Clan, deshalb ist eine übermäßige Verschlüsselung sinnlos. Zudem hat der angegebene FTP User nur beschränkte Rechte, d.h. er kann nur in das Programmverzeichnis wenn wirklich jemand den Code auslesen sollte. Außerdem werde ich bei Fertigstellung die Software Verschlüsseln lassen (man kann ja Anwendungen dafür kaufen). Mir geht es nur darum, dass der Code überprüft werden soll und hoffentlich eine Lösung für mein Problem geben wird. Habe meines Wissens den Code nämlich richtig so.

    Lg

    Edit: Die Software ist dafür gedacht, dass Termine usw angeschaut werden können und man sich auch auf gewisse Zeiträume abmelden kann

    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    @Thunderbolt, @ErfinderDesRades, @Trade: Mir ist durchaus bewusst, warum Zugriffskontrolle, bzw Sicherheit wichtig ist. Jedoch hat dies bei mir derzeit nicht den Vorrang, einfach da diese Software nur bestimmte Personen bekommen, die ich selber kenne und ich auch weiß, dass ich diese Vertrauen kann. Wieso sollte ich mir dann nun ein Haufen Arbeit machen, wenn ich weiß das damit sowieso kein Unfug gemacht wird?

    Dieser Thread ist doch nun da, um Hilfe bei anderen zu suchen, die mir möglicherweise bei meinem gestellten Problem helfen können, und nicht bei dem Sicherheitsproblem. Wie schon geschrieben, ich sehe die Problematik der Sicherheit ja wie ihr, jedoch nicht im besagten Fall, da (wie schon geschrieben) die Software nur Vertrauenswürdige Personen erhalten.

    LG
    Wie währs direkt mit php und https, währ das einfachste und sicherste und es gäbe tonnen von c&p material im internet.
    Warum php? Weil es als "server software" programmierbar ist, und du somit das mit dem speicher einfach umsetzen kannst. Du kannst auch eine serverseitige funktion bauen, die prüft ob das bild da ist und dann noch mit md5 prüfen obs auch noch das richtige ist, ohne viel traffic zu verschwenden.
    Ausserdem ist php einfach zu erlehrnen.
    Du willst doch einmal ein guter dev werden, oder? Also sei nicht so Faul und erforsche die Grenzen der IT :)
    Mfg
    Wer Rechtschreibfehler findet darf sie behalten :)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „WeLoveBurgers“ ()

    beaR schrieb:

    wenn ich weiß das damit sowieso kein Unfug gemacht wird?
    Ach wirklich? Was ist denn, wenn jemand die Verbindung mithört und dann Mist damit macht? Richtig, dein Server wird zum Warez-Sammelpunkt.

    Solaris schrieb:

    Sagen wir, eine Person hat es sich in einem Starbucks mit unverschlüsseltem WLAN gemütlich gemacht. Dein Updater wurde inzwischen von mehreren Anwendungen integriert und ist somit ein bisschen weiter verbreitet. Die Person, die dort gemütlich ihren überteuerten Kaffee schlürft, hat es auf die PCs der anderen Kunden abgesehen. Er macht einen Hotspot mit dem gleichen Namen auf und wartet, bis sich Rechner zu ihm verbinden. Dann überlegt er, wie er sein selbstgeklöppeltes oder frisch erstandenes Stück Maleware wohl an die nichts ahnenden Kaffeejunkies verteilt. Er bemerkt, dass einige Laptops fleißig versuchen, ein Update zu laden - mit deiner Update Lib. Er weiß auch, dass SSL nicht das Allheilmittel ist was es scheint, und hat sich den passenden Exploit direkt mit gekauft. Auf der GitHub Seite deines Projektes hat er auch gesehen, dass es dem Updater völlig egal ist was er herunterlädt. Er konfiguriert seinen Hotspot so, dass jede Update Anfrage mit seinem Maleware-Paket beantwortet wird. Und schon hat er sein schönes Programm an den Mann gebracht. Und das wäre deine Schuld. In der heutigen Zeit ungeprüft (ausführbare) Dateien aus dem Internet zu laden ist grob fahrlässig. Du kannst auch nicht einfach davon ausgehen, dass eine SSL Verschlüsselung 100%ig unfehlbar ist (siehe Poodle). Es kann passieren, dass korrekt eingerichtete Server über Nacht auf unbestimmte Zeit verwundbar werden. Von möglichen Zugriffen anderer "Institutionen" mal ganz abgesehen.
    Mit freundlichen Grüßen,
    Thunderbolt

    WeLoveBurgers schrieb:

    Wie währs mit ner genaueren fehlerbeschreibung?


    Ich habe das ganze schon ohne Try ausgeführt. Diese Meldung ist das, was ich bekomme. Mehr nicht. Deswegen weiß ich ja auch nicht mehr weiter, da ich nicht weiß, was er nun von mir will. Das lustige ist ja wie schon beschrieben, dass er mal Uploaded, ein anderes mal wiederum nicht, und spuckt mir dann einfach diese Meldung aus. Habe ja auch schon alles im Internet abgesucht, finde nur die Lösung nicht. Habe ja auch schon die Methode "My.Computer.Network.UploadFile" probiert, die wiederum auch nicht die Lösung war.

    @Thunderbolt: Gut, so habe ich das ganze noch nicht gesehen. Dann weiß ich ja, worum ich mich dann kümmere, wenn ich diesen Punkt abgehakt habe. Danke für das Zitat, hast mir da schon die Augen geöffnet!

    Mfg