javascript或jquery下载大文件作为URI

我正在开发一个Web应用程序,它需要的一个功能是能够以交互方式下载相当大的文件 – 该文件在服务器上不存在 – 并且完全由从数据库动态加载的数据组成.

目前我正在使用以下代码(不会为你运行,但你可以得到这个想法)
我在其中添加一个带文件名的文本框,然后是一个隐藏文本区域,包含json样式下载所需的所有文本,然后链接到尝试URI下载的函数.

有趣的是,当在chrome中运行时,我得到一个页面,说URI太长而且不能正常工作等,但文件仍然被下载.

“提交的URI太大了!
请求的URL的长度超过了此服务器的容量限制.请求无法处理.
如果您认为这是服务器错误,请与网站管理员联系.“

无论如何,令人烦恼的是:
允许这些下载的页面使用来自上一页的post / get – 因此后退按钮不可用,因为它为我们提供:

“确认重新提交表单
此网页需要您之前输入的数据才能正确显示.您可以再次发送此数据,但通过这样做,您将重复此页面之前执行的任何操作.“

page – 我想要做的是将这些URI下载产生到一个新选项卡中,这样就不需要后退按钮了,尽管添加目标空白没有帮助

另外,如上所述,我也有一个“全部下载”的功能 – 这对我来说可以在xampp服务器上本地运行,在谷歌浏览器上 – 但是那些构建应用程序以报告按钮不适用于他们(他们在使用safari的Mac上,没有机会亲自看到这个并收集信息 – 所以虽然我没有用我有限的信息预期答案,我希望有人可能有一个想法!)

码:

< script >
  function download(filename,text) {
    var element = document.createElement('a');
    element.setAttribute('href','data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    // I tried addin this but no new tab appeared!
    //element.target = "_blank:";
    element.setAttribute('download',filename);

    element.style.display = 'none';
    document.body.appendChild(element);

    element.click();

    document.body.removeChild(element);
  }

function download_all() {
  var nameElements = document.getElementsByName("name");
  var valueElements = document.getElementsByName("text");

  for (i = 0; i < nameElements.length; i++) {
    console.log(nameElements[i].value);
    console.log(valueElements[i].value);

    download(nameElements[i].value,valueElements[i].value);
  }
} <
/script>
echo "
<form onsubmit=\ "download(this['name'].value,this['text'].value)\" class=\ "form-group\">"; echo "<label for=\ "name\">Download Title</label>"; echo "<input type=\ "text\" name=\ "name\" size=\ "40\" value=\ "" . $m[ 'name'] . ".json" . "\" class=\ "form-inline\">"; //hidden=\"hidden\"> after text echo "<textarea name=\ "text\" hidden=\
    "hidden\">" . $json_meal_data . "</textarea>"; echo "<input type=\ "submit\" value=\ "Download\" class=\ "btn-primary\">"; echo "</form>"; echo "<br>"; echo "<br>";

同样值得注意的是,我在上面的代码片段中包含了“全部下载”功能.
奇怪的是,在Chrome中运行全部下载会下载所有文件,但在Safari中运行它只会下载1个文件.

解决方法

你在XAMPP中传递了太长的URL. XAMPP代表Apache.在Apache中,
最大URL长度约为4,000个字符,之后Apache产生“413 Entity Too Large”错误.

我同意@PatrickEvans最好使用URL.createObjectURL.
URL.createObjectURL()可用于构造和解析URL.具体而言,URL.createObjectURL()可用于创建对文件或Blob的引用.与base64编码的数据URL相反,它不包含对象的实际数据 – 而是包含引用.

关于这个的好处是它真的很快.以前,我们必须实例化FileReader实例并将整个文件作为base64数据URL读取,这需要时间和大量内存.使用createObjectURL(),结果立即可用,允许我们执行诸如将图像数据读取到画布之类的操作.

正如您在下面的演示中看到的那样.两个链接是相同的.但是如果你检查没有createObjectURL链接href属性太大而无法编辑但是在with createObjectURL链接中你可以编辑它,因为为了创建它我使用了URL.createObjectURL().

Online demo (jsFiddle)

相关文章

jQuery插件的种类 1、封装对象方法 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进...
扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间。 入门 编写一个jQuery插件开始于给...
最近项目中需要实现3D图片层叠旋转木马切换的效果,于是用到了jquery.roundabout.js。 兼容性如图: ht...
一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异...
AMD 模块 AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一...