如果文件没有扩展名,则electron应用程序的Nodejs http服务器未设置本地文件的正确内容类型头

igetnqfo  于 2023-05-04  发布在  Electron
关注(0)|答案(1)|浏览(202)

我使用electron和Nodejs创建了一个桌面应用程序。在这里,我下载了一些HTML,CSS和JS以及其他资产文件,如图像,视频,以在本地渲染网页。文件正在使用window.fetch下载并保存在本地。下载并保存的HTML文件没有文件扩展名。
创建一个Nodejs HTTP服务器,以便在需要时为文件提供服务。如果文件有扩展名,则来自Nodejs服务器的响应包含正确的content-type头,但如果没有扩展名,则响应包含application/octet-stream作为content-type。
因此,当从NodeJS服务器请求本地保存的HTML文件时,不是渲染/显示HTML文件,而是弹出来保存文件。尝试使用file-type检测文件类型并设置响应的内容类型,但它不适用于HTML文件。如果从Electron应用程序切换到chromeos应用程序,则此操作正常。
尝试使用file-type来检测文件类型并设置响应的内容类型,但它不适用于HTML文件。
下面是下载文件的代码。URL是HTML文件和资源的URL,如css,js,图像等。

download: {
        value: function(url, destination, settings = {}) {
            const fse = global.nodeRequire('fs-extra');
            const nodePath = global.nodeRequire('path');

            return this.fetch(url, settings).then(response => {

                if (!response.ok) {
                    return Promise.reject(new Error(response.code));
                }

                return fse.ensureDir(nodePath.dirname(destination))
                    .then(() => nodeWriteStream(destination, response));
            });
        }
    }

下面是使用Nodejs服务器访问本地存储文件的代码。在这里,我尝试使用file-type来检测文件的类型并设置响应的内容类型,但它不适用于HTML文件。
因此,首先我读取文件并检查文件是否以开头,如果是,则设置内容类型头作为响应,但我正在寻找更好的方法。这里***path***是存储所有下载文件的HTTP服务器的根路径。

const http = require('http');
const serveStatic = require('serve-static');
const serveIndex = require('serve-index');
const finalhandler = require('finalhandler');
const httpShutdown = require('http-shutdown');

function startServer(path) {
    var self = this;
    this._startPromise = new Promise(function(resolve, reject) {

        const serve = serveStatic(path); // path is the document root of this http server
        const index = serveIndex(path, {'icons': true, view: 'details'}); // Serve directory indexes for path (with icons)

        const server = http.createServer(function(req, res) {

            serve(req, res, function(err) {
               const done = finalhandler(req, res);

                if (err) {
                    return done(err);
                } else {
                    index(req, res, done);
                }
            });
        });
        server.listen({port: self._port, host: 'localhost'}, function() {

            self._server = httpShutdown(server);
            this._startPromise = null;
            resolve('http://localhost:' + self._port);
        });
    });
    return this._startPromise;
}
c7rzv4ha

c7rzv4ha1#

您尝试使用的文件类型库是基于二进制的文件,而不是文本文件。
你正在寻找的是一个库,它可以检测文件类型的签名或使用其他内容检测技术。
我建议你看看节点模块mmmagic,它做的正是你想要的。

相关问题