NodeJS 用于文件下载的HTML5/JavaScript“保存为”对话框

6tdlim6h  于 2023-01-08  发布在  Node.js
关注(0)|答案(3)|浏览(197)

我写了一个NodeJS/Express应用程序,当用户按下一个按钮时,它会生成并下载一个excel文档(使用ExcelJS创建)。当用户按下按钮时,文件会生成并下载到用户的默认下载位置。我希望用户能够在按下按钮时选择他们想要下载文件的位置。这可能吗?
我当前的JavaScript代码如下所示:

export_button.onclick = async function() {
    await fetch('/download', {
        method: 'POST'
    })
    .then(resp => resp.blob())
    .then(blob => {
        const url = window.URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.style.display = 'none';
        a.href = url;
        a.download = 'document.xlsx';
        document.body.appendChild(a);
        a.click();
        window.URL.revokeObjectURL(url);
    });
}
ojsjcaue

ojsjcaue1#

这在最新的基于Chrome的浏览器(Chrome、Edge、Opera)的桌面版本中是可能的。
当前支持:https://caniuse.com/mdn-api_window_showsavefilepicker
https://wicg.github.io/file-system-access/#api-showsavefilepicker
https://wicg.github.io/file-system-access/#enumdef-wellknowndirectory
我们使用这个来处理PDF文件:https://webpdf.pro/doc/(下一版本的草稿)。
请注意,您可以建议一个文件名和文件夹,自定义文件类型列表,提供多种类型!

事实上,我们有一个方法,其名称正是:<pdf-file>.saveAs().

Visual Studio Code的在线版本是另一个最近的用户:https://vscode.dev/.
不过,至少在未来几个月内,苹果和火狐可能会以隐私/安全问题为由拖延这一问题。

slmsl1lt

slmsl1lt2#

async function saveFile(){
      var mystring = "Hello World!";
      var myblob = new Blob([mystring], {
        type: 'text/plain'
      });

      if( window.showSaveFilePicker ) {
            const opts = {
                types: [{
                  description: 'MYfile',
                  accept: {'text/plain': ['.txt']},
                }],
                suggestedName: 'myFileText',
              };
            var handle = await showSaveFilePicker(opts);
            var writable = await handle.createWritable();
            await writable.write( myblob );
            writable.close();
        }else{
          alert( "xxx" );
        }
}
<button id="botonx" onClick="saveFile()" >Save File</button>
xqnpmsa8

xqnpmsa83#

我不相信这是可能的,不。这种行为是由用户浏览器的设置控制的。对于大多数浏览器,甚至可能是所有的浏览器,默认的行为是总是下载文件到一个默认的位置,而不显示提示,用户可以改变其目的地或文件名。可以理解的是,你不能改变用户的浏览器设置从JavaScript。
很高兴看到我错了,我没有意识到文件系统访问API Cetin Sert的答案描述的存在。

相关问题