2017-06-23 14 views
0

Ich arbeite derzeit an einer Phonegap App, und ich möchte, dass Benutzer in der Lage, jede Datei auf meinen NodeJS-Server hochladen.Datei-Upload-Fehler mit Cordova FileTransfer zu NodeJS

Ich habe alle auf der Suche rund um das Internet, aber ich kann einfach nicht alles an der Arbeit ...

Hier ist der Code ich bin für die Phonegap Controller:

$scope.open = function() 
{ 
     navigator.camera.getPicture(upload, 
     function(message) 
     { 
      alert('get picture failed'); 
     }, 
     { 
      quality: 50, 
      destinationType: navigator.camera.PictureSourceType.FILE_URI, 
      sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY, 
      mediaType: navigator.camera.MediaType.ALLMEDIA 
     }); 

    } 

    var win = function (r) { 
     $scope.log = "Code = " + r.responseCode; 
     $scope.log2 = "Response = " + r.response; 
     $scope.log3 = "Sent = " + r.bytesSent; 
     $scope.$digest(); 

    } 

    var fail = function (error) { 
     $scope.log = "An error has occurred: Code = " + error.code; 
     $scope.log2 = "upload error source " + error.source; 
     $scope.log3 = "upload error target " + error.target; 
     $scope.$digest(); 
    } 

    function upload(fileURI) 
    { 
     $scope.log = fileURI; 
     $scope.$digest(); 

     var options = new FileUploadOptions(); 
     options.fileKey = "file"; 
     options.fileName = fileURI.substr(fileURI.lastIndexOf('/') + 1); 
     options.mimeType = "text/plain"; 
     options.chunkedMode = false; 

     var params = {}; 
     params.value1 = "test"; 
     params.value2 = "param"; 
     options.params = params; 

     var ft = new FileTransfer(); 
     ft.upload(fileURI, "http://192.168.192.111:2999/upload", win, fail, options); 
    }. 

Hier der momentane Code ist für den NodeJS Server haben viele verschiedene Dinge ausprobiert, die alle ohne Erfolg:

var express = require('express'); 
var http = require('http').Server(express); 
var io = require('socket.io')(http); 
var fs = require('fs'); 

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


app.post('/upload', multer({dest: './uploads/'}).single('upl'), function(req, res) 
{ 
    console.log(req.body); 
    console.log(req.file); 
}) 


http.listen(2999, function(){ 
    console.log('listening on *:2999'); 
}); 

In der App ich verwendet, um Fehler zu erhalten, die FileUploadOptions etc nicht definiert wurden, aber ich festgelegt, dass durch eine dding sie an das Cordova-Projekt. Außerdem verwende ich ionische 1, wenn das jemand hilft.

Ich bekomme ständig den Fehlercode 1 (Upload Fehlerquelle), obwohl ich eine echte Datei ausgewählt habe und ich sah, dass der Link korrekt war (sowas wie/storage/0/emuliert/Downloads auf meinem Android Gerät) .

Auch manchmal gibt es mir auch Fehler 3 (Zielquelle hochladen), eine Art von Server nicht gefunden Problem, denke ich.

Gibt es etwas Offensichtliches, das ich falsch mache und wie würde ich es beheben können? Gibt es einen besseren Weg, da ich dies schließlich mit einer MySQL-Datenbank verknüpfen möchte.

Vielen Dank im Voraus!

Antwort

0

Gut gefunden meine Antwort (vor einer Weile, das ist für Leute, die über diesen Beitrag stolpern).

Sie können zuerst versuchen, ob Ihr JS funktioniert, indem Sie den Server in https://posttestserver.com/post.php ändern. Wenn dort ein Upload angezeigt wird, liegt ein Problem mit dem Server vor.

Das Problem bei mir war, dass ich überhaupt nicht Apache durch die Firewall lassen hat, so hochgeladene Videos von nichts außer meinem PC scheitern würde ...

0
var express=require('express'); 
var bodyParser=require('body-parser'); 
var formidable = require('formidable'); 
var util = require('util'); 
var app=express(); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(bodyParser.json()); 
var path=require('path'); 
var mysql =require('mysql'); 
var fs=require('fs'); 

app.use('/public',express.static(path.join(__dirname, 'public'))); 

var connection = mysql.createConnection({ 
     host: 'localhost', 
     user: 'root', 
     password : '', 
     port : 3306, //port mysql 
     database:'xxxxx' 
}); 
app.post('/data', function(req, res) { 

// create an incoming form object 
    var form = new formidable.IncomingForm(), 
     files = [], 
     fields = []; 
    // specify that we want to allow the user to upload multiple files in a single request 
    form.multiples = true; 

    // store all uploads in the /uploads directory 
    form.uploadDir = path.join(__dirname, '/public/images/uploads'); 
    // every time a file has been uploaded successfully, 
    // rename it to it's orignal name 
    form.on('file', function(field, file) { 
    if (path.extname(file.name)=='') { 
     extension='.jpg'; 
    } 
    else{ 
     extension=path.extname(file.name); 
    } 
    var oldpath = file.path; 
    form.uploadDir = path.basename(file.name,extension).concat((Math.random()* 100),extension);    
    var newpath = './public/images/uploads/'+ path.basename(file.name,extension).concat((Math.random()* 100),extension); 

    //fs.rename(file.path, path.join(form.uploadDir, file.name)); 
    fs.rename(oldpath, newpath); 
    }); 
    form.on('field', function(field, value) { 
     fields[field] = value; 
    }); 

    // log any errors that occur 
    form.on('error', function(err) { 
    console.log('An error has occured: \n' + err); 
    }); 

    // once all the files have been uploaded, send a response to the client 

//Call back at the end of the form. 
form.on('end', function() { 

    res.writeHead(200, { 
     'content-type': 'text/plain' 
    }); 
    res.write('received the data:\n\n'); 


    // console.log(fields.name+'-'+fields.nickname); 
    var values={ 
      name:fields.name, 
      nickname:fields.nickname, 
      email:fields.email, 
      password:fields.password, 
      dob:fields.dob, 
      gender:fields.gender, 
      phoneno:fields.phone 
     }; 

    connection.query('INSERT INTO users SET ?', values, function(err,req,res){ 
         if(err){ 
          console.log('Connection result error '+err); 

         } 
          else{ 
         console.log('Success');  

          } 
       }); 

       res.end(); 


}); 
    // parse the incoming request containing the form data 
    form.parse(req); 
}); 

//app.use(app.router); 
app.listen(5000); 
+2

Vielleicht eine Erklärung hinter diesem Code? –

+1

Eine gute Lektüre: https://stackoverflow.com/help/how-to-answer – RPichioli

+0

Es ist ein komplettes Codeformular Felder von Ajax + Jquery zu Nodejs und speichern in Mysql DB –

Verwandte Themen