web-dev-qa-db-ja.com

Googleドキュメントビューアが204の応答を返しましたが、機能しなくなりました。

UPDATE 2016-11-16 9:53 am EST

グーグルが問題を「修正」したと主張しているにもかかわらず、多くの人々がまだ204件の回答を見ているようです。私自身がドキュメントの読み込みを50回テストしたところ、そのうち3回はGoogleが204応答を返しました。

このURLにアクセスしてあなたの不幸のコメントを投稿してください。そうすれば、最終的にGoogleが問題に対処して修正できるようになります: https://productforums.google.com/forum/?utm_medium=email&utm_source= footer#!msg/docs/hmj39HMDP1M/SR2UdRUdAQAJ

UPDATE 2016-11-04 18:01 pm EST

サービスが稼働しているようです。問題に対処し、私のツイートに答えてくれたGoogleドキュメントに感謝します。それが皆さんにとってもうまくいくことを願っています。

UPDATE 2016-11-04 3:33 pm EST

https://productforums.google.com/forum/#!msg/docs/hmj39HMDP1M/X6a8xJwLBQAJ に公開されたアップデートがあり、サービスのサポートが戻ってきている可能性があることを示しているか、および/または意図しない結果を引き起こした彼らの側の問題。乞うご期待。すぐ下のコメントを参照してください:

enter image description here

スタックオーバーフローの元の投稿はここから始まります

私たちのWebソフトウェアは、Google Docsビューアーサービスを使用し、Googleドキュメントビューアーサービスに依存して(iframeを介して)ドキュメントを埋め込み、別のアプリケーションを開かなくても(URLにアクセスして)ドキュメントを表示できるようにしました。この機能はかなり前からGoogleによって提供されており、完全に機能していました。

ビューアのURLの例:

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

しかし、ロードしようとしたファイルがロードされるのは非常にまれであることに気づき始めました。私たちは当初、サーバーに問題があると考えていたため、取得したヘッダー応答の調査を開始しました。特に、行われたほとんどすべてのリクエストが204 No Contentレスポンスを返すことを指摘しました。ごくまれに200の応答がありました。

取得した204応答の1つの例を次に示します。

enter image description here

これは、私たちが受け取った200の応答のうちの1つの例です(非常にまれです)。

enter image description here

その後、Googleビューアサービスに関連する204の問題をGoogleで検索しました。私はこのページにたどり着きました https://productforums.google.com/forum/#!msg/docs/hmj39HMDP1M/X6a8xJwLBQAJ これは、Googleがサービスを突然かつ突然停止したことを示しているようです。これはその議論のスクリーンショットです(この投稿の時点で)。

enter image description here

グーグルの「専門家」がその人の同様の問い合わせに答えたという事実を考えると、視聴者サービスのサポートを公式に完全に放棄したようです。

私の質問は次のとおりです。

  1. GoogleがGoogleビューアサービスのサポートを正式に終了したかどうかを他に知っている人はいますか?

  2. 誰かが上記のビューアサービスとまったく同じことを実行できるようにする、更新された同様のGoogle製品/サービス(おそらくGoogleドライブ?)を知っていますか?理想的には、Googleサーバーに存在する必要はないがサーバーに常駐できる外部ドキュメントを参照できる単純なURLが欲しいです。

  3. Wordドキュメント、Excelドキュメント、PowerPointドキュメント、PDFなどのドキュメントをユーザーがWebサイトに埋め込むことができるようにするために提案できる他の同等および無料サービスとは何ですか?それらのアプリケーションを実際にシステムにインストールしなくても、ブラウザー内でドキュメントを表示できます。

最後に、Googleが良いことをしているということは、人々が長い間依存しているサービスを提供していて、突然プラグを抜くことができるということは、非常に腹立たしく、いらいらし、迷惑なことです。私自身だけでなく、その種の決定に対する発言の心配を決して気にしない人は他にもたくさんいると思います。 グーグルは問題を修正しましたが、私の本ではまだ問題ありません:-)

ご回答ありがとうございます。

16
Art Geigel

私もGoogle Doc Viewerの埋め込みに依存するサービスを実行しており、この問題も発生しています。他の同等のサービス(無料またはその他)は見つかりませんでした。

私は、Google Doc Viewerの使用を回避できる「ハック」を考案しました。ただし、JQueryは必要です。最終的に正しくロードされるまで、2秒ごとにiframeを更新し続けます。また、iframeを読み込みgifで覆い、常に更新されることを隠しています。私のコード:

<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>
13
Cellydy

Reactjsを使用した単純なソリューション/ハックですが、他のライブラリ/バニラにも簡単に実装できます。

基本的な概念で使用:ロードを試みます-onloadが完了した場合、間隔をクリアします。それ以外の場合は、3秒ごとに再度ロードを試みます。完全に機能する

(私は自分のコードを編集して、最小限のコードが含まれるようにしたので、テストしていません)

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>
        );
    }
}
1
jony89

この問題を次のように解決しました。 Googleビューアが読み込まれていない場合は、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>

これをТетянаВолошкаの回答で機能させることができましたが、ifステートメントを削除する必要がありました。

この

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

引き起こした

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

なぜこれが私のためにそれを修正したのか、私にはよくわかりません。おそらく2秒の遅延により、ページ上の他のすべてが読み込まれ、埋め込まれたPDFの競合が解消されましたが、クロスオリジンの問題なしにコンテンツドキュメントを取得するにはどうすればよいですか?

0
user657338

私は内部管理システムのコピービューアとしてGoogleビューアを使用していました。通常、PDFと画像ファイルのみをアップロードしているため、オールインワンソリューションは優れていて、全面的に(モバイル、デスクトップなど)機能しました。しかし、それがますます信頼できなくなるにつれて、私は創造的になりました。

私の解決策は、PDFのJPGバージョンをアップロードして表示した場合、imagickを使用して生成および保存することでした。アップロードされたすべてのPDFをバッチ処理するのではなく、アクセスしたときにのみ変換されます。

それに対する私の推論は:

  1. ユーザープールが非常に小さいので、ファイルタイプを簡単に管理できます
  2. すべてのPDFアップロード後に再度表示する必要がある可能性はほとんどないため、レポート目的で必要な場合にのみ作成されます。
  3. モバイルデバイスを介してファイルを表示する信頼できる方法が必要です。 iOSとAndroidブラウザでうまく動作しないPDFビューアと誰もがiOSデバイス(iBooksは誰ですか?)

ファイルが表示され、jpgバージョンのPDFが作成されると、ユーザーが表示するときは常にPDFの代わりに使用されます。きれいではありませんが、確実に機能します。倍増の要素ですが、ストレージの制限はありません。元のファイルも変更されていないため、3次リモートバックアップとしても機能します。これは仕様ではありませんが、偶然です。

役に立つ場合は、以下のコードを自由に使用してください。おそらくもっとエレガントな方法がありますが、私の目的とユーザーにとっては問題ありません。

            $_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%"/>';

            }
0
B Wake