Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[JAVA] Het doen van een URL request

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

ik ben in Java voor een schoolproject een Up- en downloader aan het maken, en het up- en downloaden gaat via webrequest.
Ik heb iedere keer een byte[] bytes (byte array) die data bevat die naar de server moet worden gestuurd. Normaal gesproken gaat dit via apache, dus in een normaal webrequest. Alleen ik heb geen idee hoe ik deze bytearray via het webrequest op de server krijg.

Het is bijvoorbeeld niet mogelijk om de bytearray te converteren naar een string en deze in een GET var te stoppen, omdat de URL dan ongeldig is.

Iemand die een manier weet om deze bytearray via het webrequest bij de server te krijgen?

BVD Jan

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 19:52

Gerco

Professional Newbie

Het lijkt me dat je die in een POST request wilt versturen, maar ook zal zul je waarschijnlijk wat aan encoding moeten gaan doen.

Als je het per-se in een GET request wilt doen moet je je byte[] gaan URLEncoden, maar dat werkt alleen voor kleine arrays van <1000 bytes ofzo, een GET request mag namelijk "maar" een paar kB lang zijn.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 22:56
Je zou eens naar Apache Commons FileUpload kunnen kijken.

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 23:33
Inderdaad FallenAngel666. Het Apache Commons http project is een heel erg fijn Java library om browserfunctionaliteit ( maken van http connecties etc) te kunnen doen. Echter kun je het ook simpelweg met sockets gaan oplossen. Een url request (even van uitgaande dat het niet een authenticated source is ) is in sockets niet heel erg lastig.

Maar om even po het eerste terug te komen (van FallenAngel666). Met http commons krijg je dan zoiets als :

Java:
1
2
3
4
5
6
7
GetMethod getFeed = new GetMethod(quickrFeedURL);
        
        int statusCode;
        statusCode = this.httpClient.executeMethod(getFeed);
        
        if(statusCode == 200 )
...

[ Voor 30% gewijzigd door Webgnome op 05-09-2008 15:54 ]

Strava | AP | IP | AW


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Summarizerend: je hebt dus een JSP pagina met een bestand upload veld en een Servlet die gebruik maakt van Commons FileUpload om de geuploade bestand binnen te halen? En je wilt dus vanuit die Servlet het bestand weer naar een andere server versturen?

Dat hangt af van wat de andere server snapt. Is het een HTTP server, dan zul je het via HTTP moeten versturen. Hiervoor kun je java.net.URLConnection gebruiken of, iets makkelijker, Commons PostMethod. Is het een FTP server, dan kun je het beste Commons FTPClient gebruiken.
Gerco schreef op vrijdag 05 september 2008 @ 14:29:
Als je het per-se in een GET request wilt doen moet je je byte[] gaan URLEncoden, maar dat werkt alleen voor kleine arrays van <1000 bytes ofzo, een GET request mag namelijk "maar" een paar kB lang zijn.
De maximum lengte is niet gekoppeld aan de HTTP GET specificatie, maar het is afhankelijk van de gebruike webbrowser en de pad dat de request vervolgt (proxies etc).

[ Voor 12% gewijzigd door BalusC op 05-09-2008 16:42 . Reden: De vraag is achteraf gezien erg ambiguous ]


Verwijderd

Topicstarter
De keuze voor POST is zo voor de hand liggend dat ik er zelf niet eens op was gekomen, lekker stom zeg! Heb net nu op deze manier gedaan, het lijkt te werken.

Alleen er is nog een probleem. De Java file leest een stuk van het te uploaden bestand in, alszijnde een byte array. Deze converteer in naar een string die ik encodeer als UFT-8, zodat PHP niet in de war kan raken. De request wordt gedaan naar een bestandje, upload.php, wat de volgende code bevat:
code:
1
2
3
$fp = fopen($file, 'w');
fwrite( $fp , utf8_decode( $_POST['upload'] ) );
fclose($fp);

Terwijl de afbeelding de juiste bestandsgrootte heeft, zit er toch iets fout waardoor hij het niet doet. Weet iemand wat ik hier fout doe?

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Ja, het converteren naar een String van een binaire file is wat je fout doet. Voor het uploaden van een file kun je het beste "multipart/form-data" encoding gebruiken. Oftewel: Apache HttpClient gebruiken (niet FileUpload, dat is voor de ontvangende kant op de server, maar daar gebruik je PHP).

[ Voor 20% gewijzigd door Herko_ter_Horst op 12-09-2008 14:23 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Verwijderd

Topicstarter
Ok duidelijk. :)

Bedankt, ik ga het nu daarmee proberen.

Verwijderd

Topicstarter
Er is nog een ding dat fout gaat, maar ik kan er niet de vinger op leggen. Hieronder staan beide brokken code (Java Applet, wordt later ondertekend dus de Applet restricties zijn geen issue) en upload.php, mijn server moduletje.

Alle strings die ik in de Part Array parts zet, worden zonder problemen overgezet en ontvangen door PHP. Het probleem zit in de Fileparts. Iedere keer wanneer ik hem heb uitgevoerd, heeft PHP wel een file aangemaakt, maar deze niet gevuld (hij is 0kb groot.)

Het probleem heeft er niet mee te maken dat de AppletViewer geen toegang heeft tot de schijf, uit de meting bij de eerste System.out.println blijkt dat de file zonder problemen is ingeladen.

Iemand enig idee wat ik over het hoofd zie? Ik zit er nu al bijna twee nachten mee te stoeien en het enige dat ik op het moment nog zie zijn een stel letters die dansen over m'n beeldscherm.

Groeten,
Jan

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package testFiles;

import java.applet.Applet;
import java.io.File;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;

public class TestKlasse extends Applet{
    static final long serialVersionUID = 0;
    public void init() {
        try{
            File f = new File("C:/test.jpg");
            System.out.println("In geheugen: "+f.length());
            PostMethod filePost = new PostMethod("http://localhost/DTMJ/app-files/upload.php");
            
            
            Part[] parts = {
                    new StringPart("test", "TEST TEST TEST TEST"),
                    new FilePart("b", f)
            };
            
            filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
            
            HttpClient client = new HttpClient();
            int status = client.executeMethod(filePost);
            System.out.println("done. Status: "+status);
        } catch( Exception e ) {
            
        }
    }
}


code:
1
2
3
4
5
6
7
8
9
10
11
<?php
$bytes = $_POST['b'];
$test = $_POST['test'];

$fp = fopen('data.jpg', 'w');
fwrite( $fp , $bytes );
fclose($fp);

$fp = fopen('data.txt', 'w');
fwrite( $fp , $test );
fclose($fp);

Verwijderd

Topicstarter
OPGELOST!

Bijzonder stom van me om me niet te realiseren dat iedere file die wordt gepost niet in de array $_POST komt te staan, maar in de array $_FILES. Met de php functie move_uploaded_file is het nu een karweitje van niks om alles af te maken.

Iedereen bedankt voor het meedenken en aandragen van oplossingen.

Jan
Pagina: 1