2016-04-30 4 views
0

Я пытаюсь установить мои данные в своем приложении. Я делаю это с NodeJSПоместите данные и вложение в Cloudant DB IBM bluemix

Вот мой код:

var date = new Date(); 

var data = { 
    name : obj.name, 
    serving : obj.serving, 
    cuisine : obj.cuisine, 
    uploadDate : date, 
    ingredients : obj.ing, 
    directions: obj.direction 
} //Assume that I read this from html form and it is OK 

db.insert(data, function(err, body){ 
    if(!err){ 
    console.log(body); 
    var id = body.id 
    var rev = body.rev 

    var headers = { 
     'Content-Type': req.files.image.type 
    }; 

    var dataString = '@' + req.files.image.path; 

    var options = { 
     url: 'https://username:[email protected]/db_name/' + id + '/' + req.files.image.name +'?' + 'rev=' + rev, 
     method: 'PUT', 
     headers : headers, 
     body : dataString 
    } 

    console.log(options) 

    function callback(error, response, body) { 
     if (!error && response.statusCode == 200) { 
     console.log(body); 
     } 
    } 
    request(options, callback); 

    } 

}); 

Я получаю 201 ответ после вложения изображения был отправлен. Но в облачной приборной панели я вижу "length": 38 загруженного изображения, которое невозможно.

Если я пытаюсь получить доступ загруженного изображения он дает:

{ "Ошибка": "not_found", "причина": "Документ отсутствует прикрепление"}.

Как я могу исправить эту проблему?

ответ

2

Похоже, что вы загружаете путь к изображению, а не содержание самого изображения:

var dataString = '@' + req.files.image.path; 

Это будет просто загрузить строку «@xyz» где хуг является путь к файлу. Вам необходимо загрузить содержимое изображения. Смотрите следующее для получения дополнительной информации:

https://wiki.apache.org/couchdb/HTTP_Document_API#Attachments

Я не уверен, как получить содержимое загруженного файла из req.files. Я считаю req.files больше не работает в Express 4, поэтому я использую multer:

https://github.com/expressjs/multer

Это, как я загрузить файл в Cloudant, который был загружен в мое приложение:

Client

<form action="/processform" method="post" enctype="multipart/form-data"> 
    <input type="file" name="myfile"> 
    <input type="submit" value="Submit"> 
</form> 

Node.js Routing

var multer = require('multer'); 
... 

var app = express(); 
... 

var uploadStorage = multer.memoryStorage(); 
var upload = multer({storage: uploadStorage}) 
app.post('/processform', upload.single('myfile'), processForm); 

Примечание: 'myfile' - это имя типа ввода файла в форме.

Node.js Загрузить в Cloudant

function processForm() { 

    // insert the document first... 

    var url = cloudantService.config.url; 
    url += "/mydatabase/" + doc.id; 
    url += "/" + encodeURIComponent(req.file.originalname); 
    url += "?rev=" + doc.rev; 

    var headers = { 
     'Content-Type': req.file.mimetype, 
     'Content-Length': req.file.size 
    }; 

    var requestOptions = { 
     url: url, 
     headers: headers, 
     body: req.file.buffer 
    }; 

    request.put(requestOptions, function(err, response, body) { 
     if (err) { 
      // handle error 
     } 
     else { 
      // success 
     } 
    }); 

    ... 
} 
Смежные вопросы