当前位置: 首页 > 知识库问答 >
问题:

如何在不调用服务器的情况下,从用户上传的文件(不考虑文件类型)动态创建可下载链接?

尚恩
2023-03-14

HTML:

<input id="browse" type="file" multiple>
<div id="preview"></div>

JavaScript:

var elBrowse = document.getElementById("browse");
var elPreview = document.getElementById("preview");

function readFile(file) {
    //Create downloadable link and generate DOM elements.
    var fileName = file.name;
    elPreview.insertAdjacentHTML("beforeend", "<a>" + fileName + '</a>');
    elPreview.insertAdjacentHTML("beforeend", "<a>Delete</a><br>");
}

elBrowse.addEventListener("change", function () {
    var files = this.files;

    // Check for `files` (FileList) support and if contains at least one file:
    if (files && files[0]) {

        // Iterate over every File object in the FileList array
        for (var i = 0; i < files.length; i++) {
            var file = files[i];
            readFile(file);
        }
    }

});

我面临着一个新的需求,但是我在JavaScript方面没有太多的经验。基本上,我希望用户能够通过点击浏览按钮上传文件,并显示文件名与可下载链接。用户可以上传任何类型的文件,并可以下载文件回来。

整个过程不能触发后端服务器,所有事情都必须在javascript或jQuery中完成。有谁能帮忙吗?谢谢.

系统和用户交互:

>

  • 用户上载文件

    系统将文件保存在javascript中,并显示文件名和可下载链接。

    用户删除它。

    系统将其从DOM和javascript中删除

    用户可以重复步骤1-4。整个过程根本不触发服务器。

    最终,用户通过单击其他地方将所有文件提交到服务器(此步骤不在本文的讨论范围内)

  • 共有1个答案

    蒙勇
    2023-03-14

    如果您使用的是现代浏览器,那么您可以使用HTML5文件读取器。我用过它,但在这里发现了一个更适合你的问题的例子。

    您可以使用FileReader读取客户端上的文件,并将其存储在sessionStorage、localStorage中,甚至是一个变量中。但需要注意的是,您可能会耗尽RAM,因为JavaScript的设计并不是真正用于在RAM中保留大blob。

    null

    window.onload = function() {
    		var fileInput = document.getElementById('fileInput');
    		var fileDisplayArea = document.getElementById('fileDisplayArea');
    
    		fileInput.addEventListener('change', function(e) {
    			var file = fileInput.files[0];
    			var textType = /text.*/;
    
    			if (file.type.match(textType)) {
    				var reader = new FileReader();
    
    				reader.onload = function(e) {
    					fileDisplayArea.innerText = reader.result;
    				}
    
    				reader.readAsText(file);	
    			} else {
    				fileDisplayArea.innerText = "File not supported!"
    			}
    		});
    }
    html {
      font-family: Helvetica, Arial, sans-serif;
      font-size: 100%;
      background: #333;
    }
    
    #page-wrapper {
      width: 600px;
      background: #FFF;
      padding: 1em;
      margin: 1em auto;
      min-height: 300px;
      border-top: 5px solid #69c773;
      box-shadow: 0 2px 10px rgba(0,0,0,0.8);
    }
    
    h1 {
    	margin-top: 0;
    }
    
    img {
      max-width: 100%;
    }
    
    #fileDisplayArea {
      margin-top: 2em;
      width: 100%;
      overflow-x: auto;
    }
    <div id="page-wrapper">
    
    		<h1>Text File Reader</h1>
    		<div>
    			Select a text file: 
    			<input type="file" id="fileInput">
    		</div>
    		<pre id="fileDisplayArea"><pre>
    
    	</div>
     类似资料:
    • > 如果我想直接从浏览器保存一些东西,它需要我的应用程序的API密钥,我不能把它放在HTML中,因为它不安全。 如果我试图在网页调用我的服务器的地方做任何事情,文件将必须通过我的服务器才能到达谷歌。

    • 在C语言中,我可以用和调用来创建新文件,当且仅当当前没有同名文件时。我还没能在哈斯克尔找到这样做的方法。我更喜欢提供的友好的东西,最好是为我完成所有棘手的异常处理。(我不一定期望它能正确地为我完成,但那是另一回事。)

    • 问题内容: 根据caniuse,MicrosoftEdge版本10547+支持element的属性,但IE或Safari不支持。 如何在不使用具有属性集的元素或服务器的情况下下载文件对象? 问题答案: 有多种触发下载的方法。以下是一些: 使用表格: 使用javascript:

    • 我想提取Unix tar xvf/home/test/group中的tar文件。tar和提取后得到一个文件夹组,其中包含xls、pdf和txt文件列表。 我怎样才能提取内容的group.tar /home/test/list的xls, pdf文件没有创建组文件夹。 任何特定的命令可用或必须跟随复制和移动?? 谢啦!

    • 问题内容: 有什么方法可以在客户端上创建文本文件并提示用户下载文本文件,而无需与服务器进行任何交互?我知道我不能直接写给他们的机器(安全性和全部),但是我可以创建并提示他们保存吗? 问题答案: 您可以使用数据URI。浏览器支持各不相同。 例: 八位字节流将强制进行下载提示。否则,它可能会在浏览器中打开。 对于CSV,您可以使用:

    • 在CSV文件中写入时,会自动创建文件夹,然后创建具有神秘名称的csv文件,如何使用任何特定名称创建此CSV,但无需在pyspark而不是熊猫中创建文件夹。