Javascript IE 9/10/11某些未知阈值后不渲染图像

Javascript IE 9/10/11某些未知阈值后不渲染图像,javascript,jquery,html,internet-explorer,sharepoint,Javascript,Jquery,Html,Internet Explorer,Sharepoint,我正在构建一个应用程序,从SharePoint 2013或SharePoint 2010中提取文件,以便以HTML格式查看。在C#中,文件从SharePoint(多页文档,如Word、Excel、PDF、TIFF等)中取出,然后输入各种第三方软件(DataLogics和Aspose)-这些软件将文档分解为各自的页面,然后以PNG格式将各个页面流式传输到浏览器 所以在HTML中,我们有一个img元素,它的src被设置为ASHX服务中的特定URL。ASHX服务从SharePoint中获取文件,并根据

我正在构建一个应用程序,从SharePoint 2013或SharePoint 2010中提取文件,以便以HTML格式查看。在C#中,文件从SharePoint(多页文档,如Word、Excel、PDF、TIFF等)中取出,然后输入各种第三方软件(DataLogics和Aspose)-这些软件将文档分解为各自的页面,然后以PNG格式将各个页面流式传输到浏览器

所以在HTML中,我们有一个img元素,它的src被设置为ASHX服务中的特定URL。ASHX服务从SharePoint中获取文件,并根据查询字符串参数以流的形式返回所需的页面

下面是我们反击的方式:

[WebService(Namespace = "url")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class FileTransfer : IHttpHandler, IReadOnlySessionState
{
    public void ProcessRequest(HttpContext context)
        var stream = GetStream(context.Request);
        int chunkSize = 2097152; //2MB
        byte[] chunk = new byte[chunkSize];
        int bytesRead = 0;

        do {
            bytesRead = stream.Read(chunk, 0, chunkSize);
            HttpContext.Current.Response.OutputStream.Write(chunk, 0, bytesRead);
        }
        while (bytesRead > 0);
}
当我们要分解的文件直接来自SharePoint时,这在任何浏览器中都能100%完美地工作

我们还提供了一个用户可以上传文档的功能。这就是问题所在。上载的文档未保存在SharePoint中。相反,它们的数据存储在SessionState中,直到用户选择保存。文件上载到ASMX服务,然后浏览器通过上述ASHX请求其单独页面

文件在ASMX服务中按如下方式上载:

[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
Public object Upload()
{
    var request = HttpContext.Current.Request;
    if (request.Files.Count == 1)
    {
        var uniqueId = request["uniqueId"];
        var file = request.Files[0];

        using (var memoryStream = new MemoryStream())
        {
            file.InputStream.CopyTo(memoryStream);
            docInfo = UploadItem(uniqueId, pageNum, memoryStream.ToArray());
        }
    }
}
UploadItem将uniqueId和字节[]添加到SessionState

文件是这样从javascript发送的(FileUpload与type=file输入的更改事件相关联):

在这种情况下,Chrome和Firefox正常工作,但IE再次失败。除此之外,IE的NET选项卡显示它收到了正确大小kb的响应。但是,它仍然显示损坏的图像图标,并且在一些未知阈值之后不会将图像渲染到屏幕上。最初的几个图像会回来,但一旦其中一个图像中断,其余的图像都会中断

我还修改了ASHX服务以返回base64数据而不是流,然后将base64绑定到src。在调试器中,您可以看到分配给显示断开图像图标的img元素的src的base64。所以数据确实存在,但IE只是没有呈现它

我尝试在SharePoint环境之外的地方,使用击倒JS在这个小提琴中重现这个问题。基本上,我抓取了大量的大图像,每次点击按钮都会把它们扔到屏幕上。但它工作得很好。如果我也使用jQuery,它就可以完美地工作

不知道从这里到哪里去


有什么想法吗?

结果是图像大小导致了问题。我在服务器端将图像缩小到缩略图大小,并将其返回到浏览器。目前一切正常

this.FileUpload = function (files) {
    var upload = new XMLHttpRequest();
    upload.onreadystatechange = () => {
        if (this._curUploadRequest.readyState == 4) {
            // handle response
        }
    };

    UpdateFormDigest((<any>window)._spPageContextInfo.webServerRelativeUrl,(<any>window)._spFormDigestRefreshInterval);

    var data = new FormData();
    data.append("uniqueId", uniqueId);
    data.append("pageNum", pageNum);
    data.append("data", files[0]);

    upload.open('POST', "myurl");
    upload.setRequestHeader("X-RequestDigest", $("#__REQUESTDIGEST").val());
    upload.send(data);
};
<img src="url to ASHX service" />
var img = new Image();
img.onload = function(){
   // use jquery to append image to page
};
img.src = "url to ASHX service";