【问题标题】:Node.js upload to Azure Blob Storage issuesNode.js 上传到 Azure Blob 存储问题
【发布时间】:2015-12-10 16:58:26
【问题描述】:

我是 Node.js/Express 的新手,正在尝试将简单的文件上传到 Azure blob 存储。我正在使用 AngularJS 作为前端表单。当我尝试上传文件时,我收到以下错误:

TypeError: 无法读取未定义的属性“myfile”

我见过一些例子,他们利用了一个名为 multiparty 的节点模块,但不确定它是否适用于这种基本的上传需求。来自 jQuery/前端 JavaScript 世界,在某些情况下,我需要对我的文件进行 base64 编码以便上传。在这种情况下是这样吗?还是我只是错过了一个简单的传递,以便 Node/Express 可以读取“myfile”?

由于 Express 有自己的路由器,并且我有 AngularJS 路由,这会导致问题吗?

这是我在 AngularJS 视图中的表单:

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

这是我的 server.js 配置。请注意,我使用的是 Azure blob 存储:

var express = require('express');
var azure = require('azure-storage');

// Initialize Express App
var app = express();
var port = process.env.port || 1337;
app.use(express.static(__dirname + "/public")).listen(port);

var accessKey = 'mykey';
var storageAccount = 'myblobaccount';

var blobSvc = azure.createBlobService(storageAccount,accessKey);

// Upload to Azure Blob Storate
app.post('/upload', function (req, res) {
    var path = req.files.myfile.path;
    blobSvc.createBlockBlobFromLocalFile('mycontainer', 'myblob.png', path, function (error, result, response) {
        if (!error) {
            console.log("Uploaded" + result);
    // file uploaded
        }
        else {
            console.log(error);
        }
    });
});

更新 1:

如果我使用以下内容,它会生成 POST 200 OK,但是当我使用 Azure 存储资源管理器之类的东西查看我的 Blob 容器时,该 Blob 不存在。

app.post('/upload2', function (req, res) {
    var multiparty = require('multiparty');

    var container = 'mycontainer';

    var form = new multiparty.Form();

    form.on('part', function (part) {
        if (part.filename) {

            var size = part.byteCount - part.byteOffset;
            var name = part.filename;

            blobSvc.createBlockBlobFromStream(container, name, part, size, function (error) {
                if (error) {
                    //res.send(' Blob create: error ');
                }
            });
        } else {
            form.handlePart(part);
        }
    });
    form.parse(req);
    res.send('OK');
});

【问题讨论】:

    标签: node.js azure express


    【解决方案1】:

    您可以将文件保存在服务器上,然后将其上传到 azure。

        fs.readFile(req.files.displayImage.path, function (err, data) {
      // ...
      var newPath = __dirname + "/uploads/uploadedFileName";
      fs.writeFile(newPath, data, function (err) {
        res.redirect("back");
      });
    });
    

    或者如gist所示,直接通过管道连接到天蓝色

    【讨论】:

    • 如何将其合并到我上面的天蓝色上传代码中?为什么它需要一个额外的跃点而不是直接进入 Azure?
    • 你使用newPath上传到azure
    • 为什么我不能直接上传到 Azure/如果不在我的网络服务器上保存文件可以实现吗?
    • 你可以。通过使用分段上传。请参阅我更新的答案要点。它用于上传到s3。同样适用于 azure。
    • 我的原始帖子的更新 1 正在使用 multipart,并说它使用 POST 200 OK 发布,但 Azure Blob 存储中的实际容器中没有显示任何内容。有什么线索吗?
    【解决方案2】:

    在 GitHub/Azure/azure-sdk-for-node https://github.com/Azure/azure-sdk-for-node/tree/master/examples/blobuploader 中有一个示例“blobuploader”。

    我参考了这个示例和您的代码,在下面做了一个简单的示例:

    var azure = require('azure');
    var storageAccount = '<Your Storage Account>';
    var accessKey = '<Your Access Key>'
    var blobSvc = azure.createBlobService(storageAccount, accessKey);
    
    var express = require('express');
    var formidable = require('formidable'); // the same node module as Azure sample
    var app = express();
    
    app.use(express.static('public'));   // contains a form page using the same code as yours
    
    app.get('/', function(req, res) {
        res.send('Hello World!');
    });
    
    app.post('/upload', function(req, res) {
        var form = new formidable.IncomingForm();
        form.parse(req, function(err, fields, files) {
            var options = {
                    contentType: files.myfile.type,
                    metadata: { fileName: files.myfile.name }
            };
            blobSvc.createBlockBlobFromLocalFile('mycontainer', files.myfile.name, files.myfile.path, options, function(error, result, response) {
                if(!error){
                // file uploaded
                    res.send('file uploaded!');
                }
            });
        });
        //console.log(req);
    });
    
    var server = app.listen(3000, function() {
        var host = server.address().address;
        var port = server.address().port;
        console.log('Example app listening at http://%s:%s', host, port);
    });
    

    有效!

    最好的问候。

    【讨论】:

    • 它将上传显示为挂起/停止,但不上传(浏览器图标一直在旋转)。上传本身只有 52K。
    • 好的,现在可以使用了!我使用的是 azure-storage,但它需要 azure
    猜你喜欢
    • 2018-12-28
    • 2014-08-23
    • 2018-02-18
    • 1970-01-01
    • 2023-03-28
    • 2019-05-26
    • 1970-01-01
    • 2015-11-30
    • 2019-04-06
    相关资源
    最近更新 更多