首页 文章

使用 Mongoose 将多个图像上传到 Node.js 服务器

提问于
浏览
0

我尝试将图像提交到我的服务器。

在 Objective-C 部分中,我将图像数据附加到 HTTP 正文,使用带有“name”和“filename”的“form-data”。以下是相关片段。我很确定其他部分应该是正确的。如有必要,请关注“Content-Disposition”行:

...
// Append image data to body data
NSMutableData *bodyData = [NSMutableData data];
int i = 1;
for (NSData *imgData in allImgData) {
    [bodyData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [bodyData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"photoToUpload[]\"; filename=\"%@%d.png\"\r\n", fileParamConstant, i] dataUsingEncoding:NSUTF8StringEncoding]];
    [bodyData appendData:[@"Content-Type: image/png\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [bodyData appendData:imgData];
    [bodyData appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    i++;
}
// Append one last boundary
[bodyData appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
// setting the body of the post to the reqeust
[urlRequest setHTTPBody:bodyData];
...

问题

但是,在网上搜索了几个帖子后,我仍然不太确定如何使用 mongoose 处理带有 nodejs 的服务器部分。基于我的 Objective-C 部分,我应该从“req.body”或“req.files”获取图像吗?所以我认为我的问题还在于理解 HTTP 请求**,特别是与上面的“Content-Disposition”部分有关。

下面是我当前的 nodejs 代码:

// on routes that end in /users/competitorAnalysisPhotoData
// ----------------------------------------------------
router.route('/users/competitorAnalysisPhotoData/:userName')

// update the user info (accessed at PUT http://localhost:8080/api/users/competitorAnalysisPhotoData)
    .put(function(req, res) {

        // use our user model to find the user we want
        User.findOne({ userName: req.params.userName}, function(err, user) {

            if (err)
                res.send(err);
            console.log('Got the user in "Put"!');

            // update the photos -- Version 1
            user.competitorAnalysis.push({
                photo1: req.body.photo1,
                photo2: req.body.photo2,
                photo3: req.body.photo3,
                photo4: req.body.photo4
            });
            console.log('req.body.photo1: %s', req.body.photo1);
            console.log('Save the photo data for competitorAnalysisPhotoData!');

            // update the photos -- Version 2
            user.competitorAnalysis.photo1.data = fs.readFileSync(req.files.photo1.path)
            user.competitorAnalysis.photo1.contentType = 'image/png';
            user.competitorAnalysis.photo2.data = fs.readFileSync(req.files.photo2.path)
            user.competitorAnalysis.photo2.contentType = 'image/png';
            user.competitorAnalysis.photo3.data = fs.readFileSync(req.files.photo3.path)
            user.competitorAnalysis.photo3.contentType = 'image/png';
            user.competitorAnalysis.photo4.data = fs.readFileSync(req.files.photo4.path)
            user.competitorAnalysis.photo4.contentType = 'image/png';
            console.log('req.files.photo1.path: %s', req.files.photo1.path);
            console.log('Save the photo data for competitorAnalysisPhotoData!');

            // save the user
            user.save(function(err) {
                if (err)
                    res.send(err);
                res.json({ message: 'User updated!' });
            });

        });

如果我可以得到一些关于如何正确处理server-side的建议,那将会很棒。

1 回答

  • 1

    使用 GridFS 或本地文件系统来存储文件,然后在您的 mongoose 模型中引用该文件。如果您知道 image/file 将是一个安全的大小(模型的其余部分小于 16MB),您可以将其存储为模型中的 Blob(ByteArray)。

相关问题