0

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

函数retrieveImage(studyUID,seriesUID,instanceUID,sopClassUID,nodeRef){

     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();

}

4

2 回答 2

1

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

相反,您应该将用户(或打开新窗口/选项卡)重定向到浏览器可以找到下载所需内容的 URL,并让它处理它。使用标头告诉客户端下载它或按照此处的说明显示。

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

注意:是的,我告诉你不要使用 ajax,只是window.open. 编辑:我猜你可能想在 img 中呈现图像,在这种情况下,它是相同的,只需将 url 放在 src 属性中并且没有 ajax。如果合适的话,只有一些 javascript 来更新属性。


鉴于您的评论,我了解您想要:

  1. 将图像缓存在客户端,以避免每次都必须从服务器取回图像。
  2. 允许用户自定义他的体验,允许使用来自本地存储的图像。

现在,再次出于安全原因,不允许任意访问客户的文件。在这种情况下,它可以双向工作:首先它可以防止网页监视您,其次它可以防止您在页面上注入恶意内容。

因此,对于第一部分,据我所知,默认设置是缓存图像[这是由您的浏览器处理的,是的,您应该不时清理它,因为它往往会增长]。如果这对您不起作用,我想您可以尝试使用缓存清单

关于第二种,通常的方法是使用本地存储[再次由您的浏览器处理,但不是对客户端文件的任意访问]来存储/检索图像的 url 并使用它来呈现图像。

图像仍然可以保存在服务器上,是的,它可以被缓存。要将它发送到服务器 - 当然 - 您可以随时上传它,<input type="file" ... />您可能需要将enctype设置为您的表单。- 你已经知道了,对吧?- 在服务器上,将图像存储在数据库(或专用文件夹)中。现在负责检索图像的页面应该:

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

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


或者 - 仅仅因为 - 您在一个没有服务器端脚本机会的地方托管。所以你必须只接受 javascript 给你的东西。好吧,你不能在这里使用相对路径,因为它不是本地的……如果你尝试使用本地的绝对路径,浏览器只会diss你(我的意思是,它只是忽略它)。

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

好吧,你知道有一个工作草案,我注意到这是你正在尝试的。问题是它是一个工作草案。引用Jonas Sicking的话,最初的实现会因安全问题而交错

将此功能暴露给 Web 的主要问题是安全性。您不希望任何网站都可以读取或修改您的图像。我们可以像使用 GeoLocation API 一样提供提示,鉴于此 API 可能会删除您过去 10 年的所有图片,我们可能想要更多内容。这是我们正在积极努力的事情。但是这里的情况肯定是安全是这里的难点,而不是实现低级文件操作。

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

如果这是您的情况,我建议为某些图像托管网站获取一个 API,并使用它来代替 [这可能不是免费的(或不是私有的),因此您可以更改您的网络托管已经]。

于 2012-11-09T09:30:25.993 回答
0

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

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

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

您还可以将文件以缩略图的形式存储在服务器上,但我更喜欢数据库。

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

于 2012-11-09T09:26:09.050 回答