Javascript nodejs res.download()文件

Javascript nodejs res.download()文件,javascript,node.js,Javascript,Node.js,我对nodejs之类的东西很陌生,我;我一直在研究如何从nodejs服务器上传和下载文件 上传部分工作正常,问题是下载部分 我写的代码没有错误,但是文件本身没有下载,我不知道哪里出错了 这是我的uploadss.js文件 var express = require('express'); var multer = require('multer'); var path = require('path'); var fs = require('fs'); var app = expre

我对nodejs之类的东西很陌生,我;我一直在研究如何从nodejs服务器上传和下载文件

上传部分工作正常,问题是下载部分

我写的代码没有错误,但是文件本身没有下载,我不知道哪里出错了

这是我的uploadss.js文件

var express = require('express');
var multer  =   require('multer');
var path = require('path');
var fs = require('fs');  

var app = express();
var router = express.Router();

var storage =   multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, __dirname + '/uploads');
  },
  filename: function (req, file, callback) {
    callback(null, Date.now() + path.extname(file.originalname));
  }
});
var upload = multer({ storage : storage }).array('userPhoto',5);


app.set('views', __dirname + '/views');
app.get('/index', function(req, res){
  res.render('indexss.ejs');
});

app.use('/', router);

app.post('/api/photo', function(req, res){
    upload(req, res, function(err) {
         if(err) {
            return res.end("Error uploading file.");
        }
        res.end("File is uploaded");
    });
});

router.get('/download', function(req, res) { 
  var dir = path.resolve(".") + '/uploads/';
  fs.readdir(dir, function(err, list) { 
    if (err) 
      return res.json(err);
    else
      res.json(list);
  });

});

router.get('/download/:file(*)', function(req, res, next){ 
  var file = req.params.file;
  var path = require('path');
  var path = path.resolve(".") + '/uploads/' + file;
  res.download(path, file, function(err){
    if (err){
      console.log(err);
    } else {
      console.log('downloading successful');
    }
  });
});


app.listen(8080);
下面是indexss.ejs文件,其中包含html和javascript

<html>
<head>
    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

    <!-- jQuery library -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

    <!-- Latest compiled and minified JavaScript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" ></script>

    <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery.form/3.51/jquery.form.min.js"></script>

    <script>

        $(document).ready(function() {

            $('#uploadForm').submit(function() {
                $("#status").empty().text("File is uploading...");
                $(this).ajaxSubmit({
                    error: function(xhr) {
                        console.log(xhr);
                        status('Error: ' + xhr.status);
                    },
                    success: function(response) {
                        $("#status").empty().text(response);
                        console.log(response)
                    }
                });
                return false;
            }); 


            $.ajax({
                url: "/download",
                method: "get",
                success: function(data){
                    downloadArray = data;
                    for (i = 0; i < downloadArray.length; i++){
                        console.log(downloadArray[i]);
                        console.log(typeof downloadArray[i]);
                        $('#downloadList').append("<a href='#' onclick='downloadFile(this)'>" + downloadArray[i] + "</a><br>");

                    }
                }
            });
        });
        function downloadFile(selectedFile){
            fileToDownload = $(selectedFile).text();
            console.log(fileToDownload);
            $.ajax({
                url: "/download/" + fileToDownload,
                method: "get",
                success: function(){
                    console.log('successful downloading');
                }
            });
        }
    </script>  
</head>

<body>

    <form id="uploadForm"
        enctype="multipart/form-data"
        action="/api/photo"
        method="post">
        <input type="file" name="userPhoto" multiple />
        <input type="submit" value="Upload" name="submit">
        <input type='text' id='random' name='random'><br>
        <span id = "status"></span>
    </form>

    <div id='downloadList'></div>
</body>

$(文档).ready(函数(){
$('#uploadForm')。提交(函数(){
$(“#status”).empty().text(“文件正在上载…”);
$(此).ajaxSubmit({
错误:函数(xhr){
console.log(xhr);
状态(“错误:”+xhr.status);
},
成功:功能(响应){
$(“#状态”).empty().text(响应);
console.log(响应)
}
});
返回false;
}); 
$.ajax({
网址:“/下载”,
方法:“获取”,
成功:功能(数据){
下载数组=数据;
对于(i=0;i”;
}
}
});
});
函数下载文件(selectedFile){
fileToDownload=$(selectedFile).text();
log(fileToDownload);
$.ajax({
url:“/download/”+fileToDownload,
方法:“获取”,
成功:函数(){
console.log(“成功下载”);
}
});
}


您正在用filename参数覆盖路径。试试这个:

res.download(path);
然后阅读res.download(路径[,文件名][,fn])在:

尝试以下代码

服务器

var app = express();
var fs = require('fs');
app.get('/image', function (req, res) {
    var path_image = req.headers.path;
    var src = fs.createReadStream(path_image);
    src.on('open', function () {
        src.pipe(res);
        log.info('down completed: ' + path_image);
    });
    src.on('error', function (err) {
        log.error('' + err);
    });
});
path\u image是您的文件路径,我使用发送的客户端信息

java客户端使用库

Ion.with(MainActivity.this)
.加载(“http://IP:PORT/image")
.setHeader(“路径”,路径\u服务器上的图像\u)
.ProgressCallback(新的ProgressCallback)(){
@凌驾
public void onProgress(长时间下载,长时间总计){
Log.e(“bc”,“下载+”/“+总计);
}
})
.write(新文件(路径\图像\保存\文件))
.setCallback(新的FutureCallback(){
@凌驾
未完成公共作废(例外情况e,文件){
如果(e!=null){
Log.e(“bc”,e.toString());
}
如果(文件!=null){
Log.e(“bc”,file.getAbsolutePath());
}
}
});

我认为您正面临上述问题。我认为这就是我的问题所在。您可以在呼叫下载文件链接时共享错误日志吗?另外,请共享文件结构快照,这可能是路径的问题,这是我尝试的第一件事,然后我切换到我发布的代码。我已经读过了。这是我的主要资源站点
Ion.with(MainActivity.this)
    .load("http://IP:PORT/image")
    .setHeader("path", path_image_on_server)
    .progress(new ProgressCallback() {
        @Override
        public void onProgress(long downloaded, long total) {
            Log.e("bc", "" + downloaded + " / " + total);
        }
    })
    .write(new File(path_image_save_file))
    .setCallback(new FutureCallback<File>() {
        @Override
        public void onCompleted(Exception e, File file) {
            if (e != null) {
                Log.e("bc", e.toString());
            }
            if (file != null) {
                Log.e("bc", file.getAbsolutePath());
            }
       }
   });