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

Art*_*gel 13 pdf-generation google-docs google-docs-api google-drive-api

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

看起来很多人仍然看到204回复,尽管谷歌声称已"解决"了这个问题.当我自己测试文档加载50次时,其中3次Google返回了204响应.

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

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

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

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

有一个更新发布到https://productforums.google.com/forum/#!msg/docs/hmj39HMDP1M/X6a8xJwLBQAJ,这似乎表明对该服务的支持可能正在返回和/或其结果存在问题导致意想不到的结果.敬请关注.见下面的评论:

在此输入图像描述

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

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

示例查看器URL:

https://docs.google.com/viewer?url=http://www.pdf995.com/samples/pdf.pdf
Run Code Online (Sandbox Code Playgroud)

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

以下是我们获得的204个响应之一的示例:

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

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

我的问题如下:

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

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

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

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

提前谢谢你的答案!

Cel*_*ydy 13

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

我想出了一个"黑客",可以帮助您摆脱使用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>
Run Code Online (Sandbox Code Playgroud)

  • 我同意,这很烦人.另一个"解决方案"是使用Microsoft等效的`https://view.officeapps.live.com/op/embed.aspx?src= [OFFICE_FILE_URL]`(仅适用于office文档)来显示DOC和DOCX文件和PDF.JS之类的东西来处理PDF.或者将所有文件转换为PDF并使用PDF.JS. (3认同)
  • 谢谢.我看到微软的等价物,但也注意到它无法呈现PDF.Google Viewer在它的功能上非常完美.我在[在] GoogleDocs和[at] jrochelle发推文要求解释并鼓励他们向我们提供服务.也许如果他们看到足够的愤怒,他们会考虑扭转他们的路线. (2认同)

Luk*_*uri 7

我发现解决方案Byron Dokimakis是有效的。

然而,有些人在尝试访问跨源 iframe 时可能会遇到此错误。

DOMException:阻止具有源的框架访问跨源框架。

我找到了一种破解方法来解决这个问题。我注意到,如果谷歌文档页面为空(204),则不会显示跨域异常。

所以我们可以在这里使用try catch

这是我的代码示例:

const PdfViewer = ({ url }) => {
  const iframeRef = useRef(null);
  const interval = useRef();

  const pdfUrl = createGdocsUrl(url);

  const [loaded, setLoaded] = useState(false);

  const clearCheckingInterval = () => {
    clearInterval(interval.current);
  };

  const onIframeLoaded = () => {
    clearCheckingInterval();
    setLoaded(true);
  };

  useEffect(() => {
    interval.current = setInterval(() => {
      try {
        // google docs page is blank (204), hence we need to reload the iframe.
        if (iframeRef.current.contentWindow.document.body.innerHTML === '') {
          iframeRef.current.src = pdfUrl;
        }
      } catch (e) {
        // google docs page is being loaded, but will throw CORS error.
        // it mean that the page won't be blank and we can remove the checking interval.
        onIframeLoaded();
      }
    }, 4000); // 4000ms is reasonable time to load 2MB document

    return clearCheckingInterval;
  }, []);

  return (
    <div className={css['pdf-iframe__wrapper']}>
      <iframe
        ref={iframeRef}
        className={css['pdf-iframe__inside']}
        frameBorder="no"
        onLoad={onIframeLoaded}
        src={pdfUrl}
        title="PDF Viewer"
      />

      {!loaded && (
        <div className={css['pdf-iframe__skeleton']}>
          <Skeleton height="100%" rectRadius={{ rx: 0, ry: 0 }} width="100%" />
        </div>
      )}
    </div>
  );
};
Run Code Online (Sandbox Code Playgroud)