2016-04-30 18 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」字符串其中xyz是文件的路徑。您需要上傳圖片的內容。有關詳情請參閱以下內容:

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

我不知道如何從req.files獲得上傳文件的內容。我相信req.files不再Express 4的工作,所以我用multer:

https://github.com/expressjs/multer

這是我如何上傳文件到Cloudant上傳到了我的應用程序:

客戶

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

Node.js路由

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

    ... 
}