Avatar billede katnegermis Nybegynder
04. august 2010 - 00:12 Der er 16 kommentarer

Status for mængde af overført data i et HTTP Post kald.

Hej eksperter,

Jeg sidder og forsøger at få mit program til at uploade noget data. Det går egentlig udmærket. Problemet fir mig nu, er at det tager noget tid at uploade disse data. Jeg kunne derfor godt tænke mig at brugeren ikke tror at programmet hænger, når dette er undervejs.

Jeg har følgende kode til at virke, men mangler lige dét sted, hvor jeg kan få informationen om hvor langt den er nået :)

##############################################################

    Sub Upload(ByVal binfile As String)
        Dim url As String = "http://katnegermis.dk/upload.pl"
        Dim Myfilesize As Integer = FileStuff.GetFileSize(binfile)

        Console.WriteLine("Uploading: " + Path.GetFileName(binfile))
        Dim req As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
        req.Method = "POST"
        req.ContentType = "multipart/form-data, boundary=" & BOUNDARY

        Dim post As New StreamWriter(req.GetRequestStream())
        post.WriteLine("--" & BOUNDARY)
        post.WriteLine("Content-disposition: form-data; name=""filename""; filename=""" & Path.GetFileName(binfile) & """")
        post.WriteLine("Content-type: application/octet-stream")
        post.WriteLine("Content-Length: " & (New FileInfo(binfile)).Length)
        post.WriteLine("Content-Transfer-Encoding: binary")
        post.WriteLine("")
        post.Flush()

        Dim binf As New FileStream(binfile, FileMode.Open)
        Dim b(4096) As Byte
        Dim n As Integer
        n = binf.Read(b, 0, b.Length)
        Console.WriteLine("File size: " & Myfilesize / 1024 / 1024 & " megabytes")
        While n > 0
            post.BaseStream.Write(b, 0, n)
            n = binf.Read(b, 0, b.Length)
            'Console.WriteLine(n & " missekat")
        End While

        post.BaseStream.Flush()
        post.WriteLine()
        post.WriteLine("--" & BOUNDARY & "--")
        post.Close()
        binf.Close()

        Dim resp As HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse)
        Dim sr As StreamReader = New StreamReader(resp.GetResponseStream())
        Dim hasResponse As Boolean

        hasResponse = req.HaveResponse

        If hasResponse Then
            console.writeline("Content length: " & req.ContentLength)
        End If


        Dim fullresp As String = sr.ReadToEnd()
        Console.WriteLine(sr.EndOfStream())
        Console.WriteLine(fullresp)

    End Sub


#############################################################

Jeg har forsøgt mig med nogle af arne_v's svar omkring præcis det samme emne, men jeg kan ikke hitte ud af at få det til at virke.. :(

Frustrerede hilsner
Michael
Avatar billede arne_v Ekspert
04. august 2010 - 00:21 #1
Hvis det er console saa er det nemt:

        Dim n As Integer
        Dim total As Integer
        n = binf.Read(b, 0, b.Length)
        total = n
        Console.WriteLine("File size: " & Myfilesize / 1024 / 1024 & " megabytes")
        While n > 0
            post.BaseStream.Write(b, 0, n)
            n = binf.Read(b, 0, b.Length)
            total = total + n
            Console.WriteLine(total & " ud af " & myfilesize & " er nu uploadet")
        End While
Avatar billede arne_v Ekspert
04. august 2010 - 00:21 #2
Hvis det er win form saa skal vi have startet en traad og have en ProgressBar.
Avatar billede katnegermis Nybegynder
04. august 2010 - 00:26 #3
Problemet med dét, er at det er når filen bliver bygget, og ikke når den rent faktisk bliver sendt (så vidt jeg forstår).
Den er nemlig færdig langt inden jeg får response fra serveren, om at jeg har uploadet filen.

Kan min teori passe?
Avatar billede katnegermis Nybegynder
04. august 2010 - 00:29 #4
Problemet med dét, er at den tæller op når filen bliver bygget, og ikke når den rent faktisk bliver uploadet (så vidt jeg forstår).
Den er nemlig færdig med at tælle op, langt inden jeg får response fra serveren, om at jeg har uploadet filen.

Kan min teori passe?
Avatar billede arne_v Ekspert
04. august 2010 - 00:53 #5
Ja.

Men det er et vanskeligt problem at komme uden om.

Det er kun muligt hvis upload scriptet har noget som kan levere den information løbende.
Avatar billede katnegermis Nybegynder
04. august 2010 - 00:55 #6
Altså scriptet der ligger på serveren?
Avatar billede katnegermis Nybegynder
04. august 2010 - 00:56 #7
Altså php/pearl scriptet der ligger på serveren?*
Avatar billede katnegermis Nybegynder
04. august 2010 - 00:59 #8
Og i så fald - har du en ide til et sted, hvor jeg kan læse og/eller ligefrem se et eksempel på sådan et php/pearl script?
Avatar billede arne_v Ekspert
04. august 2010 - 01:27 #9
Ja.

Det er ikke helt simpelt, Men jeg kan godt prøve at se om jeg kan finde noget.
Avatar billede katnegermis Nybegynder
04. august 2010 - 01:30 #10
Det er super at du gider hjælpe.
Mange tak!
Avatar billede arne_v Ekspert
04. august 2010 - 03:46 #11
Jeg lavede engang en sådan løsning med JSP server side.

Upload siden så ud som:

<%@page import="com.oreilly.servlet.*,com.oreilly.servlet.multipart.*,java.io.*"%>
<%
if(request.getMethod().equals("POST")) {
    MultipartParser mp = new MultipartParser(request, 1000000000);
    Part p = mp.readNextPart();
    if(p != null) {
        if(p.isFile()) {
            FilePart fp = (FilePart)p;
            InputStream is = fp.getInputStream();
            OutputStream os = new FileOutputStream("C:\\test.upl");
            int total = 0;
            byte[] b = new byte[10000];
            int n;
            while((n = is.read(b)) >= 0) {
                os.write(b, 0, n);
                total += n;
                session.setAttribute("upload_status", "Uploaded " + total + " bytes");
            }
            os.close();
            session.setAttribute("upload_status", "Upload done");
        }
    }
} else {
    session.setAttribute("upload_status", "");
}
%>
<form action="main.jsp" enctype="multipart/form-data" method="post" onsubmit="window.open('sub.jsp', 'UploadStatus', 'resizable=1,scrollbars=1,height=200,width=400')">
File to upload: <input type="file" name="upfile"/><br/>
<input type="submit" value="Upload"/>
</form>

med en status viser der så ud som:

<%@ page import="java.util.*" %>
<%
response.addHeader("refresh","5");
%>
<%=session.getAttribute("upload_status")%>
Avatar billede arne_v Ekspert
04. august 2010 - 03:47 #12
Ideen er at det script som modtager filen løbende opdaterer session med hvor meget den har læst.

Og at der så er et andet script som henter den oplysning fra session.
Avatar billede arne_v Ekspert
04. august 2010 - 03:48 #13
Du skal så:
- have lavet noget tilsvarende i PHP eller Perl
- i.s.f. at refreshe visning af status så skal din app hente den status med et simpelt HTTP kald med X sekunder mellemrum
Avatar billede arne_v Ekspert
04. august 2010 - 03:58 #14
Jeg kan evt. prøve at omskrive til PHP engang i weekenden.
Avatar billede katnegermis Nybegynder
04. august 2010 - 11:52 #15
Det kunne virkelig være sejt! Mit PHP er meget rustent, og nok tættere på ikke eksisterende ;)
Avatar billede katnegermis Nybegynder
20. august 2010 - 22:21 #16
Hej igen arne_v,

Har du haft tid til at kigge på problemet endnu engang?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester