none
http upload RRS feed

  • Frage

  • Hallo,

    der http-Upload einer Datei klappt bei mir aus unbekanntem Grund nicht.

    Hier (kurz) der Code:

    Der upzuloadende Text ist in einem Bytearray MeineBytes().

    Dann wird ein httpwebrequest mit dem Dateinamen auf dem Server, den LoginDaten, der Contentlength, der Method (WebRequestMethods.Http.Post) erstellt.

    Anschließend daran wird der Stream mit GetRequeststream angefordert.

    Und dann wird das Bytearray MeineBytes in den Stream geschrieben, der Stream danach geschlossen.

    Es gibt keine Fehlermeldungen.

    Der Response gibt auf Nachfrage:

    Protokoll Version = 1.1
    Methode = POST
    Statuscode = 200
    Statusdescription = OK
    Upload response uri = Name der Datei auf dem Server

    Aber gemacht wurde nichts! Die Datei auf dem Server ist leer (wenn ich den Vorgang ohne vorhandene Datei auf dem Server vornehme, kommt der Fehler not Found).

    Wenn ich den Vorgang als ftp-Upload mache, funktioniert alles einwandfrei.

    Kann jemand helfen?

    Henriette van de Haar
    Hamburg

    Donnerstag, 17. April 2014 12:22

Antworten

  • Hallo Henriette,

    ohne eine serverseitige Skriptverarbeitung hast Du da leider keine Möglichkeit (WebDAV ist ja sicher auch nicht aktiviert). Daher bleibt dir nur der FTP Upload oder ein Wechsel der Website zu einem anderen Provider bzw. zu einem anderen Paket deines Providers.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Henriette50 Sonntag, 20. April 2014 20:46
    Sonntag, 20. April 2014 19:36
    Moderator

Alle Antworten

  • Hallo Henriette,

    gibt es auf dem Server überhaupt ein Skript, welches den Upload entgegennimmt? Falls nicht, da muss aber eines hin. HTTP Upload überträgt keine Datei an sich, sondern sendet einen Request in einem bestimmten Format und dort enthalten ist der Inhalt der Datei.

    Das einfachste wird sein, einen ASP.NET Handler (ASHX) auf dem Server zu hinterlegen und den dann anzusprechen.

    Hier findest Du ein Beispiel, welches genau das macht (war im Grunde auch dieselbe Fragestellung wie bei dir):

      http://social.msdn.microsoft.com/Forums/vstudio/de-DE/1a4f50ce-f0d6-4c4d-9a24-8eea0e8a299d/fehler-beim-upload-einer-datei?forum=visualcsharpde


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 17. April 2014 12:38
    Moderator
  • Hallo Stefan,

    danke für die Antwort!

    Ich habe mir diesen ASP.NET Handler, der unter dem Link von Dir angegebenen Link, zu finden war, angesehen:

    <%@ WebHandler Language="VB" Class="Upload" %>
    
    Imports System
    Imports System.IO
    Imports System.Xml
    Imports System.Web
    
    Public Class Upload : Implements IHttpHandler
        
        Public Sub ProcessRequest( ByVal context As HttpContext ) Implements IHttpHandler.ProcessRequest
    
        Dim File As HttpPostedFile = context.Request.Files( 0 )
            
            File.SaveAs( "X:\Ordner\" & Path.GetFileName( File.FileName ) )
    
            context.Response.ContentType = "text/html"
            context.Response.Write( "Datei erfolgreich hochgeladen" )
    
        End Sub
     
        Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
            Get
                Return False
            End Get
        End Property
    
    End Class

    Sicherlich muss da noch was geändert werden. "X/Ordner" geht wohl nicht! Soll da die http-Adresse rein? Und wie spreche ich die Datei an bzw.wie mache ich bei meinem httpwebrequest klar, dass dieser Handler ausgeführt werden muss um die Datei auf dem Server zu speichern?

    Gruß,
    Henriette

    Donnerstag, 17. April 2014 13:07
  • Hallo Henriette,

    dieser Handler muss auf einen ASP.NET fähigen Webserver. Dort kannst Du den in der betreffenden Website bspw. als Upload.ashx ablegen.

    In deinem clientseitigen Code gibst Du dann für den HttpWebRequest als Zieladresse:

      http://deinserver/Upload.ashx

    anstelle deiner bisherigen Angabe:

      http://deinserver/deinezieldatei.txt

    an. X:\Ordner\... ist der Pfad, auf dem die vom Client per Http Upload gesendete Datei auf dem Server gespeichert werden soll.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 17. April 2014 13:35
    Moderator
  • Hallo Stefan,

    eben habe ich es mit Upload.ashx versucht, aber es passierte das übliche: Erfolgsmeldungen (200) ohne Ergebnis.
    Jetzt habe ich einen völlig anderen Verdacht. Kann so etwas am Passwort liegen?
    Eben habe ich mein Programm ohne Passwortangabe ausgeführt und ..... es geschah das gleiche wie immer: Erfolgsmeldung 200.
    Gibt es so etwas wie ein spezifisches HTTP-Zugangspasswort? Ich habe die FTP-Zugangsdaten für den HTTP-Upload angegeben...
    Das würde auch erklären, warum der HTTP-Download klappt, denn dafür braucht man sicherlich kein Passwort.

    Gruss,
    Henriette

    Donnerstag, 17. April 2014 15:06
  • Hallo Henriette,

    nein, daran liegt es sicher nicht. Wenn der Handler korrekt angesprochen wird und dein Uploadinhalt korrekt ist (was er aber nicht ist, wenn Du nur den Dateiinhalt in den RequestStream einfügst) sollte das auch klappen.

    Probier doch bitte mal:

    Dim client As New System.Net.WebClient()
        client.UploadFile( "http://deinserver/upload.ashx", "C:\LokalerPfad\Dateiname.txt" )

    Siehe dazu:

      http://msdn.microsoft.com/de-de/library/36s52zhs.aspx

    Damit wird der Upload korrekt so durchgeführt, wie ein HttpUpload eben aussehen muss. Das wäre im einfachsten Fall sowas hi

    -----------------------------7d26b54b037a
    Content-Disposition: form-data; name="fl1"; filename="D:\test.txt"
    Content-Type: text/plain

    <dateiinhalt>
    -----------------------------7d26b54b037a--


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 17. April 2014 20:02
    Moderator
  • Hallo Stefan,

    eben habe ich das Programm so durchgeführt, wie es unter dem angegebenen  microsoft-link beschrieben wird.
    Leider hat es nicht funktioniert. Dies kann nur noch daran liegen, dass ich in der Datei, die auf dem Server liegt und die Requests verarbeitet, Fehler habe. Ich habe die Beispieldatei aus dem Microsoft buchstabengetreu übernommen und als zu speichernde Datei eingetragen:

    file.SaveAs("\" & file.FileName)

    Der Datei habe ich irgeneinen Namen mit .html-Endung gegeben und sie dann auf den Server geladen.

    Wo liege ich falsch?

    Gruss,
    Henriette

    Freitag, 18. April 2014 10:17
  • Hallo Henriette,

    um dir weiterhelfen zu können, brauchen wir die genaue und vollständige Fehlermeldung (zumindest, wenn Du eine Fehlermeldung erhältst). Dazu den Code, den Du ausprobiert hast.

    Ich würde sowohl im Clientprogramm als auch im serverseitigen Teil wirklich mal nur gezielt diese eine Funktion ausführen. Erstell dazu sinnvollerweise ein neues Projekt bzw. in deinem Fall zwei. Einmal eine WinForms oder Konsolenanwendung, die nur die eine Funktion, das Ausführen von <WebClient>.UploadFile( ... ) hat und ein ASP.NET Projekt, in welches Du den Handler einbaust. Das ASP.NET Projekt solltest Du dann debuggen und einen Breakpoint im Handler setzen. Dann siehst Du genau, was da ankommt, wie es verarbeitet wird, ...


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 18. April 2014 18:40
    Moderator
  • Hallo Stefan,

    der Code ist jetzt relativ einfach. Im VB-Projekt:

    Dim client As New System.Net.WebClient()
    client.Credentials = New NetworkCredential(loginname, passwort)
    Dim AntwortArray As Byte() = client.UploadFile(uploadverarbeitungsadresse, lokaleclientdatei) 

    Die Credentials enthalten die FTP-Zugangsdaten, was wahrscheinlich gar nicht nötig ist.
    lokaleclientdatei ist die Datei auf meinem Computer (c:\......\.......txt)
    uploadverarbeitungsadresse ist die Datei auf dem Server (also http://www......de/Verarbeiten.asp), die den HTTP in Emfang nimmt.

    Hier der Inhalt von Verarbeiten.asp:

    <%@ Import Namespace="System"%>
    <%@ Import Namespace="System.IO"%>
    <%@ Import Namespace="System.Net"%>
    <%@ Import NameSpace="System.Web"%>

    <Script language="VB" runat=server>
        Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

            Dim f As String
            Dim file
            For Each f In Request.Files.AllKeys
                file = Request.Files(f)
                file.SaveAs("\" & file.FileName)
            Next f

        End Sub

    </Script>
    <html>
    <body>
    <p> Upload complete. </p>
    </body>
    </html>      

    Wenn ich das VB-Programm ausführe, erhalte ich als responsestring den Inhalt eben dieser Verarbeitungsdatei mit 3 Fragezeichen davor.
    Ein ASP.NET-Projekt habe ich gar nicht. Ich hatte es so verstanden, dass man für Http-Uploads eben nur diese Datei auf dem Server haben muss, wobei ich nicht mal weiß, welche Extension (.txt, .html, .asp) diese Datei haben muss.

    Gruss,
    Henriette

    Freitag, 18. April 2014 21:47
  • Hallo Henriette,

    die Dateiendung für den Handler war .ashx, schrieb ich doch oben.

    Für einen HTTP Upload musst Du auf deinem Webserver etwas haben, was den Request mit der Datei (oder auch den Dateien) verarbeiten kann.

    Ein Webserver wird von Haus aus keine Datei auf deinem Server überschreiben, nur weil irgendjemand das so anfordert. Bei FTP ist das anders, das Protokoll ist genau für sowas (Dateitransfer) gedacht.

    I(n meinem Beispiel ist das Gegenstück auf dem Webserver ein ASP.NET Handler, der wird eben als Upload.ashx [.ashx ist die Dateiendung] gespeichert. Diesen Handler spricht der Client mit einem passend formatierten Request an.

    Damit ASP.NET bzw. der Handler laufen kann, muss der Webserver ASP.NET natürlich unterstützen. Bei einem IIS sollte das in der Regel automatisch klappen, falls nicht, muss man das noch nachinstallieren.

    In deinem Fall wird der Handler nicht ausgeführt, sondern nur als reine Plaintextdatei an den Client geliefert. Das deutet eben darauf hin, dass der Webserver mit ASP.NET rein gar nichts anzufangen weiß.

    Auf anderen Webservern als Windows/IIS könnte man ggfs. mit Mono arbeiten, da empfiehlt es sich in der Regel aber, gleich mit einem PHP Skript anstelle des ASP.NET Handlers zu arbeiten.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Sonntag, 20. April 2014 07:45
    Moderator
  • Hallo Stefan,

    erst mal Frohe Ostern!

    Danke für Deine Antwort. Ich glaube, ich habe es jetzt verstanden. Auch ein Upload.ashx wird unverarbeitet zurückgegeben. Der Server ist wohl nicht ASP.NET-fähig. Die Domain ist bei 1&1 untergebracht. Gibt es irgeneine VB- oder anderweitige Methode, mit der man feststellen kann, ob ein Server ASP.NET unterstützt?

    Gruss,
    Henriette

    Sonntag, 20. April 2014 09:40
  • Hallo Henriette,

    das sollte sich aus der Paketbeschreibung deines Providers rauslesen lassen.

    Generell kannst Du auch einfach mal die zurückgegebenen Header im Browser (bspw. per Firebug in Firefox oder den Developer Tools für IE, Chrome, ..., jeweils erreichbar über F12) anschauen, wenn Du http://deinserver/Upload.ashx mal manuell im Browser aufrufst. Wenn dort etwas wie "Server: Microsoft-IIS/8.0" oder "X-AspNet-Version: ..." steht, wäre ASP.NET vom Grundsatz her verfügbar. Ob das in deinem Webhostingpaket nutzbar ist, kann man so aber nicht sagen.

    Wie gesagt, ein PHP Skript tut's auch, wenn das Paket bei deinem Provider ASP.NET nicht unterstützt, PHP aber schon.

      http://geekswithblogs.net/pranav/archive/2009/10/26/upload-file-using-c-as-client-and-php-as-server.aspx


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Sonntag, 20. April 2014 10:00
    Moderator
  • Hallo Stefan,

    das Paket hat tatsächlich kein ASP.NET.
    Nun habe ich es mit der angegebenen upload.php-Datei versucht.
    Blöderweise erlaubt die Site keinen Zugriff darauf!
    Ich habe versucht, mit CHMOD die Berechtigungen zu ändern, aber das System setzt diese einfach wieder zurück auf nur Lesen und Schreiben und eben nicht ausführen.

    Seufz!

    Gruss,
    Henriette

    Sonntag, 20. April 2014 18:04
  • Hallo Henriette,

    ohne eine serverseitige Skriptverarbeitung hast Du da leider keine Möglichkeit (WebDAV ist ja sicher auch nicht aktiviert). Daher bleibt dir nur der FTP Upload oder ein Wechsel der Website zu einem anderen Provider bzw. zu einem anderen Paket deines Providers.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Henriette50 Sonntag, 20. April 2014 20:46
    Sonntag, 20. April 2014 19:36
    Moderator
  • Hallo Stefan,

    das ist dann leider so. Ich danke Dir sehr für Deine Mühe. Ich habe eine Menge gelernt!

    Gruss,
    Henriette

    Sonntag, 20. April 2014 20:45