2017-06-23 1 views
0

Je travaille actuellement sur une application Phonegap, et je voudrais que les utilisateurs puissent télécharger n'importe quel fichier sur mon serveur NodeJS.Erreur de transfert de fichier en utilisant Cordova FileTransfer vers NodeJS

Je l'ai cherchée partout sur le web, mais je ne peux pas obtenir quoi que ce soit au travail ...

Voici le code que je utilise pour le contrôleur Phonegap:

$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); 
    }. 

ici est le code actuel pour le serveur NodeJS, ont essayé beaucoup de choses différentes, sans y réussir

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'); 
}); 

Dans l'application, je l'habitude d'obtenir des erreurs qui FileUploadOptions etc ne sont pas définis, mais je fixe par un les envoyer au projet Cordova. En outre, j'utilise ionique 1, si cela aide quelqu'un. Je reçois constamment le code d'erreur 1 (source d'erreur de téléchargement), même si j'ai sélectionné un fichier réel et j'ai vu que le lien était correct (quelque chose comme/storage/0/émulé/Téléchargements sur mon appareil Android) .

Aussi, parfois il me donne aussi l'erreur 3 (télécharger la source cible), une sorte de problème de serveur non trouvé je pense.

Y at-il quelque chose d'évident que je fais mal et comment serais-je capable de le réparer? Y a-t-il un moyen plus pratique, puisque je veux éventuellement lier ceci à une base de données MySQL.

Merci d'avance!

Répondre

0

Bien trouvé ma réponse (il y a quelque temps, c'est pour les gens qui trébuchent sur ce post).

Vous pouvez d'abord essayer si votre JS fonctionne en changeant le serveur en https://posttestserver.com/post.php. Si vous voyez un téléchargement apparaitre, il y a un problème avec le serveur.

Le problème avec moi est que je ne l'ai pas laissé Apache à travers le pare-feu du tout, si les téléchargements de quoi que ce soit en dehors de mon PC échoueraient ...

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

Peut-être une explication derrière ce code? –

+1

Une bonne lecture: https://stackoverflow.com/help/how-to-answer – RPichioli

+0

C'est un champs de formulaire de code complet de ajax + jquery à nodejs et enregistrer dans mysql DB –