3 Stimmen

mehrteilige Datei-Upload-Post-Anfrage von Java

Ich versuche, ein Programm zu erstellen, das ein Bild auf einen Webserver hochlädt, der mehrteilige Dateiuploads akzeptiert.

Genauer gesagt möchte ich eine http-POST-Anfrage stellen an http://iqs.me die eine Datei in der Variablen "pic" sendet.

Ich habe viele Versuche unternommen, aber ich weiß nicht, ob ich auch nur annähernd so weit gekommen bin. Der schwierigste Teil scheint zu sein, eine HttpURLConnection dazu zu bringen, eine Anfrage vom Typ POST zu stellen. Die Antwort, die ich erhalte, sieht aus wie es ein GET macht.

(Und ich möchte dies ohne jegliche Drittanbieter-Libs tun)

UPDATE: nicht funktionierender Code geht hier (keine Fehler, aber scheint nicht ein POST zu tun):

  HttpURLConnection conn = null;
  BufferedReader br = null;
  DataOutputStream dos = null;
  DataInputStream inStream = null;

  InputStream is = null;
  OutputStream os = null;
  boolean ret = false;
  String StrMessage = "";
  String exsistingFileName = "myScreenShot.png";

  String lineEnd = "\r\n";
  String twoHyphens = "--";
  String boundary =  "*****";

  int bytesRead, bytesAvailable, bufferSize;
  byte[] buffer;
  int maxBufferSize = 1*1024*1024;
  String responseFromServer = "";
  String urlString = "http://iqs.local.com/index.php";

  try{
    FileInputStream fileInputStream = new FileInputStream( new File(exsistingFileName) );
    URL url = new URL(urlString);
    conn = (HttpURLConnection) url.openConnection();
    conn.setDoInput(true);
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    conn.setUseCaches(false);

    conn.setRequestProperty("Connection", "Keep-Alive");
    conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);

    dos = new DataOutputStream( conn.getOutputStream() );

    dos.writeBytes(twoHyphens + boundary + lineEnd);
    dos.writeBytes("Content-Disposition: form-data; name=\"pic\";" + " filename=\"" + exsistingFileName +"\"" + lineEnd);
    dos.writeBytes(lineEnd);

    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    buffer = new byte[bufferSize];

    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

    while (bytesRead > 0){
      dos.write(buffer, 0, bufferSize);
      bytesAvailable = fileInputStream.available();
      bufferSize = Math.min(bytesAvailable, maxBufferSize);
      bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    }

    dos.writeBytes(lineEnd);
    dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

    fileInputStream.close();
    dos.flush();
    dos.close();

  }catch (MalformedURLException ex){
    System.out.println("Error:"+ex);
  }catch (IOException ioe){
    System.out.println("Error:"+ioe);
  }

  try{
    inStream = new DataInputStream ( conn.getInputStream() );
    String str;
    while (( str = inStream.readLine()) != null){
      System.out.println(str);
    }
    inStream.close();
  }catch (IOException ioex){
    System.out.println("Error: "+ioex);
  }

2voto

James Kingsbery Punkte 7039

Zwei Dinge:

  1. Stellen Sie sicher, dass Sie setRequestMethod aufrufen, um die HTTP-Anforderung als POST einzustellen . Sie sollten sich darüber im Klaren sein, dass es schwierig und fehleranfällig ist, mehrteilige POST-Anfragen von Hand auszuführen.

  2. Wenn Sie unter *NIX arbeiten, können Sie das Tool netcat ist sehr nützlich bei der Fehlersuche. ausführen
    netcat -l -p 3000

    und richten Sie Ihr Programm auf Port 3000; Sie werden genau sehen, was das Programm sendet (Control-C, um es anschließend zu schließen).

0voto

Aashish Katta Punkte 1144

Ich habe dies verwendet und fand es beim Hochladen mehrerer Dateien nützlich

File f = new File(filePath);
PostMethod filePost = new PostMethod(url);
Part[] parts = { new FilePart("file", f) };
filePost.setRequestEntity(new MultipartRequestEntity(parts,
filePost.getParams()));
HttpClient client = new HttpClient();
status = client.executeMethod(filePost);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X