Javascript 有任何方法可以将图像/pdf内容保存到适用于所有浏览器的本地文件系统中

Javascript 有任何方法可以将图像/pdf内容保存到适用于所有浏览器的本地文件系统中,javascript,jquery,Javascript,Jquery,我通过ajax响应在数组缓冲区中获取图像内容。将该数组缓冲区附加到blob builder。现在我想将这些内容写入文件。有什么方法可以做到这一点吗。。? 我使用了windows.requestFileSystem,它在chrome上运行良好,但在mozilla中不起作用。。 这是我的一段代码 函数检索图像(studyUID、seriesUID、instanceUID、sopClassUID、nodeRef){ }您不能用通用的方法将响应存储在与所有浏览器兼容的文件中, 有一种方法,你可以在jav

我通过ajax响应在数组缓冲区中获取图像内容。将该数组缓冲区附加到blob builder。现在我想将这些内容写入文件。有什么方法可以做到这一点吗。。? 我使用了windows.requestFileSystem,它在chrome上运行良好,但在mozilla中不起作用。。 这是我的一段代码

函数检索图像(studyUID、seriesUID、instanceUID、sopClassUID、nodeRef){


}

您不能用通用的方法将响应存储在与所有浏览器兼容的文件中, 有一种方法,你可以在javascript中使用FileReader,但这同样不能在IE上使用

几周前,我遇到了类似的问题,我所做的是向服务器发出ajax请求,传递内容,服务器将内容存储在文件中,然后返回对存储文件的引用

我将文件存储在一个临时数据库表中,服务器操作返回了该文件的id,通过该id,我们可以随时从数据库访问该文件

您也可以将文件存储在服务器上的一些缩略图中,但我更喜欢数据库


如果您需要更多的规范,请告诉我

网页脚本不允许将任意文件[如PDF]写入客户端存储。你应该心存感激,因为这意味着网页很难在你的机器上安装恶意软件

相反,您应该将用户重定向(或打开一个新窗口/选项卡)到一个url,在该url中,浏览器可以找到需要下载的内容,并让它处理。使用标题通知客户端下载它,或按说明显示

如果需要动态创建下载的内容,请在服务器上对其进行管理,使其成为活动页面(.php、.jsp、.aspx等)。重要的是在响应的头中有正确的MIME类型

注意:是的,我告诉您不要使用ajax,只需
窗口。打开
编辑:我想您可能希望在img中显示图像,在这种情况下,它是相同的,只需将url放在src属性中,并且没有ajax。如果合适,只有一些javascript可以更新属性


根据您的意见,我理解您希望:

  • 要在客户机中缓存映像以避免每次都必须从服务器取回映像
  • 允许用户自定义其体验,允许使用本地存储中的图像
  • 现在,同样出于安全原因,不允许对客户端文件进行任意访问。在这种情况下,它有两种工作方式:第一种是防止网页刺探你,第二种是防止你在网页上插入恶意内容

    因此,就第一部分而言,据我所知,默认情况是缓存图像[这由浏览器处理,是的,您应该不时清理它,因为它会增长]。如果这对你不起作用,我想你可以试着用一个

    关于第二种情况,通常的方法是使用[这同样由浏览器处理,但不是对客户端文件的任意访问]存储/检索图像的url并使用它呈现图像

    图像仍然可以保存在服务器上,是的,它可以缓存。当然,要将其上传到服务器,您可以随时使用
    上传,您可能需要将其设置为您的表单。-你早就知道了,对吧在服务器上,将映像存储在数据库(或专用文件夹)上。现在,负责检索图像的页面应该:

    • 检查请求方法
    • 检查用户的权限(通过会话/cookie识别)
    • 检查请求的参数(如果有)
    • 设置标题
    • 将文件输出到数据库(或专用文件夹)

    现在,假设您希望将其作为xcopy可部署应用程序(恰好在浏览器中运行)使用。在这种情况下,您可以随时告诉用户将所需图像存储在特定位置,并使用相对路径访问它们


    或者——仅仅因为——您在一个没有服务器端脚本的地方托管。因此,您只能使用javascript提供的内容。这里不能使用相对路径,因为它不是本地路径。。。如果你试图使用一个本地绝对路径,浏览器就会拒绝你(我的意思是,它会忽略它)

    因此,您无法从客户端的文件中获取图像,也无法将其存储在服务器上

    嗯,正如你所知道的,这是一个很好的方法,我注意到这就是你正在尝试的。问题是这是一份工作草案。最初的实现是通过安全问题实现的,引述如下:

    向web公开此功能的主要问题是安全性。你不会只希望任何网站阅读或修改你的图片。我们可以像使用地理定位API一样提供一个提示,因为该API可能会删除过去10年中您的所有图片,我们可能还需要更多。这是我们正在积极努力的事情。但这里的情况肯定是,安全性是这里的难点,而不是实现低级文件操作

    那么,我猜答案是“还没有”?事实上,考虑到微软只提供标准中达到推荐状态的部分的做法,以及在每个新版本的Windows上发布新版本IE的做法。。。然后,您需要等待一段时间才能在所有浏览器中获得支持。首先等待FileAPI达到推荐状态。然后等待Microsoft更新IE以支持它。而且,如果有任何机会(似乎会发生这种情况),它只适用于IE10(或未来的IE11),而那些DEO在Windows8之前无法在Windows上工作,那么你将等待很多人升级

    如果这是您的情况,我建议为某个图像托管网站获取一个API,并使用它[这可能不是免费的(或者不是私有的),因此您可以
         window.requestFileSystem = window.requestFileSystem||window.webkitRequestFileSystem;
    var xhr = new XMLHttpRequest();
    var url="/alfresco/createthumbnail?ticket="+ticket+"&node="+nodeRef;
    xhr.open('GET', url, true);
    xhr.responseType = 'arraybuffer';
    
    xhr.onload = function(e) {
        if(this.status == 200) {
            window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
                var fn = '';
                if(sopClassUID == '1.2.840.10008.5.1.4.1.1.104.1') {
                    fn = instanceUID+'.pdf';
                } else {
                    fn = instanceUID+'.jpg';
                }
    
                        fs.root.getFile(fn, {create:true}, function(fileEntry) {
                         fileEntry.createWriter(function(writer) {
                         writer.onwriteend = function(e) {
                            console.log(fileEntry.fullPath + " created");
    
                        }
                        writer.onerror = function(e) {
                            console.log(e.toString());
                        }
    
                        var bb;
                        if(window.BlobBuilder) {
                            bb = new BlobBuilder();
                        } else if(window.WebKitBlobBuilder) {
                            bb = new WebKitBlobBuilder();
                        }
                        bb.append(xhr.response);
    
                        if(sopClassUID == '1.2.840.10008.5.1.4.1.1.104.1') {
                            writer.write(bb.getBlob('application/pdf'));
                        } else {
                            writer.write(bb.getBlob('image/jpeg'));
                        }
                    }, fileErrorHandler);
                }, fileErrorHandler);
            }, fileErrorHandler);
        }
    };
    xhr.send();