Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Docs viewer returning 204 responses, no longer working, alternatives?

UPDATE 2016-11-16 9:53am EST

It appears many people are still seeing 204 responses even though Google has claimed to have "fixed" the problem. When I myself tested the loading of a document 50 times, 3 of those times Google returned a 204 response.

Please visit this URL and post a comment of your unhappiness so that we can finally get Google to address and fix the issue once and for all: https://productforums.google.com/forum/?utm_medium=email&utm_source=footer#!msg/docs/hmj39HMDP1M/SR2UdRUdAQAJ

UPDATE 2016-11-04 6:01pm EST

It looks like the service is up and working again! Thanks to Google Docs for addressing the issue and answering my tweets. Hope it's working for all of you too.

UPDATE 2016-11-04 3:33pm EST

There was an update published to https://productforums.google.com/forum/#!msg/docs/hmj39HMDP1M/X6a8xJwLBQAJ which seems to indicate support for the service might be returning and/or there was an issue on their end which caused unintended results. Stay tuned. See comment immediately below:

enter image description here

Original Post on Stack Overflow Starts Here

Our web software used and relied on the Google Docs viewer service to embed documents into our website (via iframe) and to give our customers the ability to view docs without having to open separate applications (via visiting the URL). This functionality was provided by Google for quite some time and had worked perfectly!

Example viewer URL:

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

We began to notice, however, that files we were trying to load would only load very rarely. We initially thought there was an issue with their servers so began investigating the header responses we were getting. Particularly, we noted that nearly every request made was returning a 204 No Content response. Very occasionally we got a 200 response.

Here's an example of one of the 204 responses we got:

enter image description here

Here's an example of one of the 200 responses we got (very rare):

enter image description here

After that I searched Google for 204 issues associated with the Google viewer service. I ended up on this page https://productforums.google.com/forum/#!msg/docs/hmj39HMDP1M/X6a8xJwLBQAJ which seems to indicate that Google has suddenly and abruptly discontinued the service. Here's a screenshot of that discussion (as of the time of this post).

enter image description here

Given the fact that a Google "expert" replied to the person's similar inquiry; it seems that they've officially and totally abandoned support for the viewer service.

My questions are the following:

  1. Does anyone else know for certain whether Google officially ended its support of the Google viewer service?

  2. Does anyone know of an updated similar Google product/service (perhaps Google Drive?) that allows a person to do the exact same thing as the viewer service referenced above? Ideally, I'd like a simple URL where I can reference an external document that doesn't have to exist on a Google server but can still reside on my server.

  3. What are some other comparable and free services you can suggest to allow me to embed documents such as Word docs, Excel docs, PowerPoint docs, and PDFs into a website that allows the user to view the documents within the browser without having to have those applications actually installed on their system.

As a final note, I just want to say that for all the good Google does it's incredibly infuriating, frustrating, and annoying that they can offer a service that people rely on for a long time and suddenly pull the plug on it. I'm sure there are many others besides just myself that will never bother voicing concerns over that type of decision. Google corrected the issue and is still good in my book :-)

Thanks ahead of time for your answers!

like image 528
Art Geigel Avatar asked Nov 04 '16 01:11

Art Geigel


People also ask

Why did my Google Docs stop working?

Clear your browser cache and cookies and then try to load your Drive files again. You can put large files in Drive, but if you exceed the size limits, they might not load properly. If your file is too big or close to the limit, divide the information into more than one file.

What is Google Drive Viewer?

Google Docs Viewer is a web application that can open all your Internet documents directly from your web browser. To use it, all you have to do is visit http://docs.google.com/viewer and enter the document URL.


4 Answers

I run a service that also relies on embedding the Google Doc Viewer and I have also encountered this issue. I could not find any other comparable service (free or otherwise).

I have come up with a 'hack' that can help you get away with using the Google Doc Viewer. It does require JQuery though. What I do is keep refreshing the iframe every 2 seconds until it finally loads correctly. I also cover the iframe with a loading gif to hide the constant refreshing. My code:

<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>
like image 152
Cellydy Avatar answered Oct 20 '22 06:10

Cellydy


Here is a react example in functional component

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()}
        />
    );
}
like image 31
Ihsan Müjdeci Avatar answered Oct 20 '22 06:10

Ihsan Müjdeci


I found that solution from Byron Dokimakis is worked.

However, some of you maybe get this error when try to access iframe of cross origin.

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

I found a hackish way to fix this. I noticed that the cross-origin exception not showed if the google docs page is empty (204).

So we can use try catch here

Here is the example of my codes:

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>
  );
};
like image 36
Luki Centuri Avatar answered Oct 20 '22 06:10

Luki Centuri


A simple solution/hack with Reactjs, though can be easily implemented to any other library/vanilla.

Used with a basic concept : tries to load - if onload accomplish, clear interval, otherwise try to load again every 3 sec. works perfectly

(I've edited my own code it so it will contain minimum code, so not tested)

var React = require('react');

export default class IframeGoogleDocs extends React.Component {
    constructor(props) {
        super();
        this.bindActions();
    }
    bindActions() {
        this.updateIframeSrc = this.updateIframeSrc.bind(this);
        this.iframeLoaded = this.iframeLoaded.bind(this);
    }
    iframeLoaded() {
        clearInterval(this.iframeTimeoutId);
    }
    getIframeLink() {
        return `https://docs.google.com/gview?url=${this.props.url}`; // no need for this if thats not dynamic
    }
    updateIframeSrc() {
        this.refs.iframe.src = this.getIframeLink();
    }
    componentDidMount() {
        this.iframeTimeoutId = setInterval(
            this.updateIframeSrc, 1000 * 3
        );
    }
    render() {
        return (
            <iframe onLoad={this.iframeLoaded} onError={this.updateIframeSrc} ref="iframe" src={this.getIframeLink()}></iframe>
        );
    }
}
like image 24
jony89 Avatar answered Oct 20 '22 05:10

jony89