2016-05-29 6 views
2

Ich versuche ein Bild von einer Android-Anwendung mit einem benutzerdefinierten MultipartEntity hochladen, die auch eine ProgressDialog aktualisiert (das ist auch mein Grund für die Verwendung der veralteten MultipartEntity) .
Relevante Java-Code:Bild mit Java MultipartEntity auf Node.js Server mit Express und Multer hochladen

 File file = new File(imgPath); 

     HttpPost post = new HttpPost("http://" + SERVER + "/upload"); 

     MultipartEntity entity = new MyMultipartEntity(new MyMultipartEntity.ProgressListener() 
     { 
      public void transferred(long num) 
      { 
       publishProgress((int) ((num/(float) totalSize) * 100)); 
       Log.d("DEBUG", num + " - " + totalSize); 
      } 
     }); 
     ContentBody cbFile = new FileBody(file, "image/jpeg"); 
     entity.addPart("source", cbFile); 

     totalSize = entity.getContentLength(); 

     post.setEntity(entity); 

     HttpResponse response = client.execute(post); 
     int statusCode = response.getStatusLine().getStatusCode(); 

     if(statusCode == HttpStatus.SC_OK){ 
      String fullRes = EntityUtils.toString(response.getEntity()); 
      Log.d("DEBUG", fullRes); 

     } else { 
      Log.d("DEBUG", "HTTP Fail, Response Code: " + statusCode); 
     } 

Node.js Server-Datei:

var fs = require('fs'); 

var express = require('express'); 
var app = express(); 

var multer = require('multer'); 
var upload = multer(
    { 
     limits: { 
      fieldNameSize: 999999999, 
      fieldSize: 999999999 
     }, 
     dest: 'uploads/' } 
    ); 

app.get('/', function(req, res){ 
    res.send(
     '<form action="/upload" method="post" enctype="multipart/form-data">'+ 
     '<input type="file" name="source">'+ 
     '<input type="submit" value="Upload">'+ 
     '</form>' 
    ); 
}); 

app.post('/upload', upload.any(), function(req, res){ 

    console.log(req.files); 

    var tmp_path = req.files[0].path; 

    var target_path = 'uploads/' + req.files[0].originalname; 

    var src = fs.createReadStream(tmp_path); 
    var dest = fs.createWriteStream(target_path); 
    src.pipe(dest); 
    src.on('end', function() { res.send("ok"); }); 
    src.on('error', function(err) { res.send({error: "upload failed"}); }); 
}); 

app.get('/info', function(req, res){ 
    console.log(__dirname); 
    res.send("image upload server: post /upload"); 
}); 

app.listen(8080); 
console.log('started server on localhost...'); 

ich auch die upload.single() Ansatz versucht haben (die durch das Formular funktioniert), aber das erfordert den Namen des Feldes Ich bin mir nicht sicher, wie/wenn ich das Java-Multipart-Entity-Objekt hinzufügen kann.

Was ich zur Zeit immer wird eine leere files Array auf Antrag und eine source Variable auf Antrag body enthalten, was, wie die Rohdaten des Bildes scheint, so dass im Grunde sieht es aus wie multer nicht überhaupt etwas zu tun . Was vermisse ich?

Vielen Dank!

+0

Danke, @Vlad. Alles funktioniert! Ich habe nur eine Frage: Wenn Sie dies auf localhost testen, speichert der Server 2 Dateien mit der gleichen Größe; Wie kann ich die temporäre Datei entfernen und nur die endgültige Datei verlassen? – Minoru

Antwort

4

Ich landete die Android Ion-Bibliothek - https://github.com/koush/ion

Java-Code:

Ion.with(context) 
      .load("http://" + SERVER + ":8080/upload") 
      .progressDialog(pd) 
      .setMultipartParameter("name", "source") 
      .setMultipartFile("image", "image/jpeg", new File(imgPath)) 
      .asJsonObject() 
      .setCallback(new FutureCallback<JsonObject>() { 
       @Override 
       public void onCompleted(Exception e, JsonObject result) { 

        //do stuff with result 
       } 
      }); 

Der Code-Server blieb unverändert.

+0

Danke dafür. Habe ich nach stundenlangem Suchen gefunden. Ehrlich gesagt, nichts anderes funktionierte. – Rick

+0

Hallo, ich habe versucht, dies zu verwenden, aber ich bekomme nicht 'req.files [0] .path' im' req.files' Objekt auf dem Server können Sie mir dabei helfen? – VishAl

+0

@Vlad Gibt es eine Möglichkeit, mehrere Dateien in einer einzigen Anfrage zu senden? – Rusty

Verwandte Themen