Загрузка файла с сервера в NodeJS

У меня есть служба REST на Java, и у нее есть конечная точка, которая отправляет файл клиенту (HTTP GET, / file). Мой внешний клиент находится в NodeJS. Я не могу загрузить файл из службы REST. Я могу хранить файл только в определенном месте, но я хочу иметь диалоговое окно загрузки, в котором пользователь может сохранить файл (как и любое другое диалоговое окно загрузки). Мой код NodeJS выглядит следующим образом:

router.get('/openFile',function(req,res){
    native_data_retrieval_rest_client.get("http://localhost:8080/file?fileName=presentation.pcap",function(data){
        var fileName="/home/files/presentation.pcap";
        res.download(data);//This doesnt open dialogue box 

        fs.writeFile(fileName, data, function (err) {
            if (err) {
                //Error handling
            } else {
                console.log('Done');
            }
        });
    });
});

Файл сохраняется статически на месте /home/files/presentation.pcap.

Ответ моей службы REST выглядит следующим образом:

response.setHeader("Content-Disposition", "attachment; filename="
                    + fileName);
            response.setHeader("Content-Type", type);

            reportBytes = new byte[131072];// New change
            OutputStream os = response.getOutputStream();// New change
            int read = 0;
            while ((read = inputStream.read(reportBytes)) != -1) {
                os.write(reportBytes, 0, read);
            }
            //System.out.println("Bytes sent" + reportBytes);
            os.flush();
            os.close();

И результат, который я получаю на стороне NodeJS, похож на поле предупреждения с содержимым файла в нем. См. Вывод ниже:

введите описание изображения здесь

Может кто-нибудь, пожалуйста, дайте мне знать, какую ошибку я здесь делаю. Я хотел бы иметь диалоговое окно загрузки, когда пользователь нажимает кнопку «Загрузить». При нажатии кнопки загрузки вызов должен быть отправлен в службу REST, которая, в свою очередь, отправит файл на передний конец NodeJS, и откроется диалоговое окно, которое спросит пользователя о местоположении.

Мой звонок из HTML выглядит следующим образом:

tr.append("td").append("button")
.on("click", function(){

           openFile();
          })

 function openFile(){
          alert("button clicked");

          $http.get('/openFile/').success(function(response) {
              console.log(response.response);
           }).error(function(error){
              alert(error);
            });

          }

javascript,node.js,rest,express,

0

Ответов: 1


1 принят

res.download () не принимает данные. Требуется путь к файлу.

http://expressjs.com/en/api.html#res.download

Вы хотите вызвать res.download в успешном обратном вызове fs.writeFile

var fileName = "presentation.pcap";
var filePath = "/home/files/" + fileName;

fs.writeFile(filePath, data, function (err) {
    if (err) {
        //Error handling
    } else {
        console.log('Done');
        res.download(filePath, fileName, function(err) {
            console.log('download callback called');
            if( err ) {
                console.log('something went wrong');
            }

        }); // pass in the path to the newly created file
    }
});

Обновить

Если вы используете запрос ajax, его невозможно загрузить файл таким образом. Браузеры делают невозможным загрузку через запросы ajax.

То, что вы хотите сделать, это просто использовать URL-адрес для загрузки файла в элемент привязки.

HTML

<a class="button" href="http://localhost:3000/openFile" target="_blank">Get request</a>

Если вам нужно сделать это с помощью javascript, вы можете использовать метод window.open ().

Javascript

$('.button').click(function(e) {
    e.preventDefault();
    window.open('http://localhost:3000/openFile', '_blank');
});

Я использовал jQuery в этом примере, но я думаю, что это иллюстрирует, что нужно сделать. Часть window.open - важная часть.

JavaScript, Node.js, отдых, экспресс,
Похожие вопросы