javascript - Node js如何处理文件响应

标签 javascript node.js express

嗨,我正在尝试进行 ajax 图像上传。这是我到目前为止所做的工作。

我的index.html: //index.html

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title>File Upload showing Upload Progress</title>
    <style>
        * {
            font-family: Verdana;
            font-size: 12px;
        }
    </style>
</head>
<body>


<form action="/upload" method="post" enctype="multipart/form-data" id="MyUploadForm">
<input name="ImageFile" id="imageInput" type="file" />
<input type="submit"  id="submit-btn" value="Upload" />
<img src="images/ajax-loader.gif" id="loading-img" style="display:none;" alt="Please Wait"/>
</form>
<div id="output"></div>

    <script type='text/javascript' src='http://code.jquery.com/jquery-1.7.1.min.js'></script>
    <script type='text/javascript' src='main.js'></script>
</body>
<script type="text/javascript" src="js/jquery.form.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
    var options = {
            target:   '#output',   // target element(s) to be updated with server response
            beforeSubmit:  beforeSubmit,  // pre-submit callback
            resetForm: true        // reset the form after successful submit
        };

     $('#MyUploadForm').submit(function() {
            $(this).ajaxSubmit(options);  //Ajax Submit form           
            // return false to prevent standard browser submit and page navigation
            return false;
        });
});

//function to check file size before uploading.
function beforeSubmit(){
    alert('ok');
    //check whether browser fully supports all File API
   if (window.File && window.FileReader && window.FileList && window.Blob)
    {

        if( !$('#imageInput').val()) //check empty input filed
        {
            $("#output").html("Are you kidding me?");
            return false
        }

        var fsize = $('#imageInput')[0].files[0].size; //get file size
        var ftype = $('#imageInput')[0].files[0].type; // get file type


        //allow only valid image file types
        switch(ftype)
        {
            case 'image/png': case 'image/gif': case 'image/jpeg': case 'image/pjpeg':
                break;
            default:
                $("#output").html("<b>"+ftype+"</b> Unsupported file type!");
                return false
        }

        //Allowed file size is less than 1 MB (1048576)
        if(fsize>1048576)
        {
            $("#output").html("<b>"+fsize +"</b> Too big Image file! <br />Please reduce the size of your photo using an image editor.");
            return false
        }

        $('#submit-btn').hide(); //hide submit button
        $('#loading-img').show(); //hide submit button
        $("#output").html("");  
    }
    else
    {
        //Output error to older unsupported browsers that doesn't support HTML5 File API
        $("#output").html("Please upgrade your browser, because your current browser lacks some new features we need!");
        return false;
    }
}

</script>

</html>

和我的 app.js

var express = require('express');   //Express Web Server 
var bodyParser = require('body-parser'); //connects bodyParsing middleware
var formidable = require('formidable');
var path = require('path');     //used for file path
var fs =require('fs-extra');    //File System-needed for renaming file etc

var app = express();
app.use(express.static(path.join(__dirname, 'public')));

app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);
/* ========================================================== 
 bodyParser() required to allow Express to see the uploaded files
============================================================ */
app.use(bodyParser({defer: true}));

app.route('/').get(function(req,res)
{
    console.log("Server started!");
     res.render('index.html');
     res.end('done');
    });

app.post('/upload', function(req, res) {
    var form = new formidable.IncomingForm();
    form.parse(req, function(err, fields, files) {
        console.log(files);
        res.send('fileinfo: ' +files);
    });
});

var server = app.listen(3030, function() {
console.log('Listening on port %d', server.address().port);
});

我在服务器端收到以下响应:

   { ImageFile: 
       { domain: null,
         _events: {},
         _maxListeners: undefined,
         size: 238027,
         path: '/tmp/a7b06a71ff10de78cc8b941b18762b73',
         name: 'bg.jpg',
         type: 'image/jpeg',
         hash: null,
         lastModifiedDate: Sun Jun 01 2014 04:05:57 GMT+0530 (IST),
         _writeStream: 
          { _writableState: [Object],
            writable: true,
            domain: null,
            _events: {},
            _maxListeners: undefined,
            path: '/tmp/a7b06a71ff10de78cc8b941b18762b73',
            fd: null,
            flags: 'w',
            mode: 438,
            start: undefined,
            pos: undefined,
            bytesWritten: 238027,
            closed: true } } }

现在我想知道如何将此文件移动到上传文件夹中。而且当我提交时,它会进入另一个页面。我想在不重新加载的情况下执行它,在 Node 中有什么办法吗?提前致谢。

最佳答案

fs-extra 模块具有 move 方法。像这样使用它:

app.post('/upload', function(req, res) {
    var form = new formidable.IncomingForm();
    form.parse(req, function(err, fields, files) {
        fs.move(files.ImageFile.path, __dirname + '/upload/' + files.ImageFile.name, function(err) {
            if (err) return console.log(err);

            console.log('Moved successfully');
        });
        res.send('fileinfo: ' + files);
    });
});

因此上传的文件会以原始名称出现在 upload 文件夹中。有 2 个注意事项:

  • upload 文件夹应该存在;
  • 如果具有此类名称的文件已存在,则不会被覆盖,因此您可能应该在每次上传时生成唯一的文件名(将 files.ImageFile.name 替换为您的唯一文件名)。

关于javascript - Node js如何处理文件响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23979433/

相关文章:

javascript - 如何在 D3.js/C3.js 中格式化数字

javascript - Angular 2 构造函数 ngOnInit 未定义属性 TypeScript

javascript - 有没有地方可以放置您希望在用户第一次下载/打开您的 chrome 扩展程序时运行的 Javascript 代码?

node.js - Put 方法不在后端使用 NodeJS 更新 Angular7 中的 MongoDB

javascript - 如何在 Keystone js 中添加源映射

node.js - 用户注销 : Redirect GET to POST (Node/Express)

node.js - 用于用户和管理员的 deserializeUser

javascript - 我只能从二级域获取 cookie 吗?

javascript - 使用 Angular 循环遍历文件夹中的所有文件/图像

node.js - Socket.io 失败 : WebSocket is closed before the connection is established