Google文档查看器返回204个响应,不再有效,替代方案?

时间:2016-11-04 01:41:47

标签: google-drive-api pdf-generation google-docs google-docs-api

更新2016-11-16美国东部时间上午9:53

似乎很多人仍然看到204回复,尽管谷歌声称已经修复了#34;问题。当我自己测试文档加载50次时,其中3次Google返回了204响应。

请访问此网址并发布您的不满意评论,以便我们最终让谷歌一劳永逸地解决并解决问题:https://productforums.google.com/forum/?utm_medium=email&utm_source=footer#!msg/docs/hmj39HMDP1M/SR2UdRUdAQAJ

更新2016-11-04美国东部时间下午6:01

看起来服务已经恢复正常运行!感谢Google文档处理此问题并回复我的推文。希望它也为你们所有人工作。

更新2016-11-04美国东部时间下午3:33

有一个更新发布到https://productforums.google.com/forum/#!msg/docs/hmj39HMDP1M/X6a8xJwLBQAJ,似乎表明对该服务的支持可能正在返回和/或在他们的结束时出现了导致意外结果的问题。敬请关注。请参见下面的评论:

enter image description here

Stack Overflow上的原始帖子从这里开始

我们的网络软件使用并依赖Google Docs查看器服务将文档嵌入我们的网站(通过iframe),并使我们的客户能够查看文档而无需打开单独的应用程序(通过访问URL)。此功能由Google提供了相当长的一段时间,并且运行良好!

示例查看器网址:

https://docs.google.com/viewer?url=http://www.pdf995.com/samples/pdf.pdf

但是,我们开始注意到,我们尝试加载的文件只会很少加载。我们最初认为他们的服务器存在问题所以我们开始调查我们得到的标题响应。特别是,我们注意到几乎所有请求都返回了204 No Content响应。我们偶尔得到200回复​​。

以下是我们获得的204个回复之一的示例:

enter image description here

以下是我们收到的200条回复之一(非常罕见)的例子:

enter image description here

之后,我搜索了Google与Google查看器服务相关的204个问题。我最终登上了这个页面https://productforums.google.com/forum/#!msg/docs/hmj39HMDP1M/X6a8xJwLBQAJ,这似乎表明谷歌突然间突然停止了这项服务。这是该讨论的截图(截至本文发布时)。

enter image description here

鉴于谷歌"专家"回复了该人的类似询问;他们似乎正式并完全放弃了对观众服务的支持。

我的问题如下:

  1. 是否有其他人确定Google是否正式结束了对Google查看服务的支持?

  2. 是否有人知道更新的类似Google产品/服务(可能是Google云端硬盘?),它允许一个人做与上面提到的查看器服务完全相同的事情?理想情况下,我想要一个简单的网址,我可以在其中引用一个不必存在于Google服务器上但仍然可以驻留在我的服务器上的外部文档。

  3. 您可以建议使用其他类似的和免费服务,以便将Word文档,Excel文档,PowerPoint文档和PDF等文档嵌入到允许用户访问的网站中在浏览器中查看文档而无需在其系统上实际安装这些应用程序。

  4. 作为最后一点,我只是想说,对于所有优秀的Google来说,令人难以置信的令人生气,令人沮丧和恼人的是,他们可以提供人们长期依赖的服务,突然拉上插头。我确信除了我自己之外还有很多其他人都不会对这种决定表达担忧。 Google纠正了这个问题并且在我的书中仍然很好: - )

    提前感谢您的回答!

8 个答案:

答案 0 :(得分:10)

我运行的服务也依赖于嵌入Google Doc Viewer,我也遇到过这个问题。我找不到任何其他类似的服务(免费或其他)。

我想出了一个' hack'这可以帮助您摆脱使用Google Doc Viewer。它确实需要JQuery。我所做的是每2秒刷新一次iframe,直到它最终正确加载。我还用一个加载gif来覆盖iframe以隐藏不断的刷新。我的代码:

<style>
.holds-the-iframe {
    background:url(/img/loading.gif) center center no-repeat;
}
</style>

<div class="holds-the-iframe">
      <iframe id="iframeID" name="iframeID" src="https://docs.google.com/viewerng/viewer?url=www.example.com&embedded=true"></iframe>
</div>

<script>
function reloadIFrame() {
    document.getElementById("ifm").src=document.getElementById("iframeID").src;
}

timerId = setInterval("reloadIFrame();", 2000);

$( document ).ready(function() {
    $('#iframeID').on('load', function() {
        clearInterval(timerId);
        console.log("Finally Loaded");
    });
});
</script>

答案 1 :(得分:1)

这是功能组件中的一个反应示例

import React, {useEffect, useRef, useState} from "react";

type IframeGoogleDocsProps = {
    url: string,
    className?: string
};
export default function IframeGoogleDoc({url, className}: IframeGoogleDocsProps) {

    const [iframeTimeoutId, setIframeTimeoutId] = useState(undefined);
    const iframeRef = useRef(null);

    useEffect(()=>{
        const intervalId = setInterval(
            updateIframeSrc, 1000 * 3
        );
        setIframeTimeoutId(intervalId)
    },[]);

    function iframeLoaded() {
        clearInterval(iframeTimeoutId);
    }
    function getIframeLink() {
        return `https://docs.google.com/gview?url=${url}&embedded=true`;
    }
    function updateIframeSrc() {
        if(iframeRef.current){
            iframeRef.current.src = getIframeLink();
        }
    }

    return (
        <iframe
            className={className}
            onLoad={iframeLoaded}
            onError={updateIframeSrc}
            ref={iframeRef}
            src={getIframeLink()}
        />
    );
}

答案 2 :(得分:1)

我可能有一个愚蠢的问题,但是,为什么我们要检查文档是否已加载? 捕获响应 204 并刷新直到我们得到 200 并不容易(然后我们确定文档已加载):)

答案 3 :(得分:0)

我使用Google Viewer作为内部管理系统的复制查看器,我们通常只上传PDF和图像文件,因此一体化解决方案非常出色,全面工作(手机,桌面等) )。然而,随着它越来越不可靠,我发挥了创造力。

我的解决方案是使用imagick生成并保存JPG版本的PDF,如果在上传后查看的话。它们不是对所有上传的PDF进行批处理,而是仅在访问它们时进行转换。

我的理由是:

  1. 我的用户池非常小,因此可以轻松管理文件类型
  2. 上传后需要再次查看每个PDF的可能性几乎为零,因此只有在需要报告时才会创建。
  3. 我需要一种通过移动设备查看文件的可靠方法。 iOS和Android在浏览器PDF查看器中效果不佳,每个人都知道iOS设备上有多少麻烦(iBooks是谁?)
  4. 一旦查看了文件并创建了pdf的jpg版本,就会在用户查看时使用它来代替PDF。不是很漂亮,但肯定有效,我承认有一个加倍的元素,但我没有任何存储限制。原始文件也不会被修改,所以它也可以作为第三级远程备份。这不是设计,而是巧合。

    如果它对你有用,请随意使用下面的代码。可能有更优雅的方法来做到这一点,但对于我的目的和用户来说,这很好。

                $_thumbnail = 'files/thumbnails/'.$_section.'/'.$_fileName.'.jpg';
    
                if (!file_exists($_thumbnail)) {
    
                        $_file = 'files/'.$_section.'/'.$_fileName;
    
                        $imagePreview = new imagick();
                        $imagePreview->setResolution(300, 300);
                        $imagePreview->readimage($_file);
                        $imagePreview->setImageFormat( "jpg" );
                        $imagePreview->writeImage('files/thumbnails/'.$_section.'/'.$_fileName.'.jpg');
    
                        echo '<img src="/files/thumbnails/'.$_section.'/'.$_fileName.'.jpg" width="100%"/>';
    
                } else {
                        echo '<img src="/files/thumbnails/'.$_section.'/'.$_fileName.'.jpg" width="100%"/>';
    
                }
    

答案 4 :(得分:0)

我如下解决了这个问题。如果未加载Google Viewer,请重新启动iframe。

function reloadIFrame() {
var iframe = document.getElementById("iFrame");
  console.log(frame.contentDocument.URL); //work control
  if(iframe.contentDocument.URL == "about:blank"){
    iframe.src =  iframe.src;
  }
}
var timerId = setInterval("reloadIFrame();", 2000);

$( document ).ready(function() {
    $('#menuiFrame').on('load', function() {
        clearInterval(timerId);
        console.log("Finally Loaded"); //work control
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<iframe id="iFrame" src="https://docs.google.com/gview?url=http:exemple.pdf?entryPoint=projectimage&id=1bef4781-5eb5-60b0-8f0b-5426c9877ebe&type=apoll_Web_Project_Files&embedded=true" style="width:718px; height:700px;" frameborder="0"></iframe>

答案 5 :(得分:0)

我能够使用ТетянаВолошка的答案,但是我不得不删除if语句,因为

iframe.contentDocument.URL == "about:blank"

原因

DOMException: Blocked a frame with origin from accessing a cross-origin frame.

我不太确定为什么要为我修复它。也许2秒的延迟使我页面上的其他所有内容都可以加载,并消除了要加载的嵌入式pdf的任何冲突,但是在没有跨域问题的情况下,我还能如何获得内容文档?

答案 6 :(得分:0)

我还想在这里共享this solution,因为上述答案对于大型文档无法有效发挥作用:iFrame开始加载后,加载事件将在几秒钟后不触发,因此您可能最终陷入无限循环。更好的解决方案是还要检查iFrame主体的大小。

答案 7 :(得分:0)

我花了很多时间终于找到了解决方案!!!

最好的选择是使用 Adob​​e 提供的免费服务,PDF embed API

HERE

  1. 创建您的项目
  2. 获取您的客户 ID
  3. 添加您的域(它只会 为该域工作)