Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 安全文件服务_Javascript_Jquery - Fatal编程技术网

Javascript 安全文件服务

Javascript 安全文件服务,javascript,jquery,Javascript,Jquery,我试图提供一个网站的安全文件服务功能。我已经考虑了几个适合我当前车型的选项: 使用XMLHttpRequest检索文件内容,然后根据文件类型和用户偏好提供显示或另存为功能 我了解如何使用二进制Ajax功能(blob、arraybuffer)检索二进制文件,我也了解了如何实现HTML5另存为功能,但我关心的是这种技术的性能:大文件。我还没有测试过,但我不希望使用这种技术下载1GB+文件时有好的性能 在链接上设置HTTP头(请参见下文),这样我就可以在头中传递身份验证令牌,但仍然可以像正常下载一样将

我试图提供一个网站的安全文件服务功能。我已经考虑了几个适合我当前车型的选项:

  • 使用XMLHttpRequest检索文件内容,然后根据文件类型和用户偏好提供显示或另存为功能
  • 我了解如何使用二进制Ajax功能(blob、arraybuffer)检索二进制文件,我也了解了如何实现HTML5另存为功能,但我关心的是这种技术的性能:大文件。我还没有测试过,但我不希望使用这种技术下载1GB+文件时有好的性能

  • 在链接上设置HTTP头(请参见下文),这样我就可以在头中传递身份验证令牌,但仍然可以像正常下载一样将文件直接提供给浏览器,而不是通过XMLHttpRequest检索内容
  • 我更喜欢这种方法,因为它非常适合当前的身份验证框架,只需要很少的额外代码,但据我所知,只有Firefox支持我想要做的事情

    Firefox能够在非由JavaScript代码使用httpChannel显式启动的网络调用中设置http头:。有人知道其他浏览器是否支持此功能吗?我希望能够设置链接,例如:

    window.location.href = 'blah';
    
    并具有观察设置自定义HTTP头的网络流量的代码:

    httpChannel.setRequestHeader("X-Hello", "World", false);
    
    虽然Firefox可以做到这一点很酷,但我需要一个跨浏览器的解决方案。我看到这个问题:


    这基本上就是我想要做的,但唯一推荐的解决方案是设置会话cookies,我不使用它。

    好的,所以我使用选项1构建了一个函数。从我的问题。仍然担心文件大小和性能,但这里有一个基本解决方案:

    viewFile : function( fileItem ) {
    
        var xhr = new XMLHttpRequest(), token, contentType, filename;
    
        xhr.onreadystatechange = function() {
    
            token = xhr.getResponseHeader( "X-Token" );
    
            if( token !== undefined && token !== null ){
                app.model.set( "token", token );
                sessionStorage.token = token;
            }
    
            if ( xhr.readyState === 4 ) {
                contentType = xhr.getResponseHeader( "Content-Type" );
                filename = xhr.getResponseHeader( "X-Filename" );
                response = xhr.response;
                var blob = new Blob([xhr.response], { type: contentType } );
                saveAs( blob, filename ); 
            }
        };
    
        xhr.open( 'GET', "/index.cfm/api/filelocker/" + fileItem.fileid, true );
        xhr.responseType = "arraybuffer";
        xhr.setRequestHeader ( "X-Token", app.model.get( "token" ) );
    
        xhr.send();     
    }
    

    此技术使用现有的身份验证机制。我来看看它对大文件的处理效果如何

    这听起来像是个XY问题。您的用例是什么?也许是的,让我重申一下问题。正常登录和只允许经过身份验证的用户下载有什么问题?@PeeHaa它就是这样做的,但是当前的身份验证机制在每个请求的http请求头中使用一个令牌,因此我需要使用现有的机制,这将与我正在研究的两个选项之一一起工作,或者使用其他功能扩展当前机制。