2

PHP経由でダウンロードを強制することで、キャンバスを画像としてダウンロードする仕組みを開発しようとしています。次のコードは Chrome デスクトップでは機能しますが、Android 2.3 ストック ブラウザでは機能しません。

HTML と JavaScript:

<script> function downloadImage()
{

    document.getElementById('action').value = 'downloadfile';
    document.getElementById('source').value = document.getElementById('finalimage').src;
    document.getElementById('user').value = userId;
    document.getElementById('imageForm').submit();
}
</script>
<html>
    <form id="imageForm" action="" method="post" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="source" id="source" value=""/>
    <input type="hidden" name="action" id="action" value="savefile"/>
     <input type="hidden" name="user" id="user" value=""/>
    </form>
</html>

PHP コード:

<?php

header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"colouringbook-page.jpg\"");
    header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
    header("Pragma: no-cache");
    header("Content-transfer-encoding: binary");

        $source = $_REQUEST['source'];
        $source = base64_decode(substr($source, strpos($source, ",")+1));
        header("Content-Length: " . strlen($source));
        print $source;
        exit;
?>

私が得ている問題は、まず「ダウンロードに失敗しました」です。その後、ダウンロードに成功すると、イメージが破損します。

[アップデート]

ブラウザに出力して、そこから画像を保存しようとしてテストしています。画像が表示されていますが、画像を保存する際のファイル命名スキームは *.html です

Androidストックブラウザのバグである可能性があるようです。画像をサーバーに保存できましたが、そこからバッファを出力して画像をダウンロードできませんでした。通常のhtmlタグを出力してから、Androidで「名前を付けて保存」して画像をダウンロードする必要がありました。

4

2 に答える 2

1

最近、HTTP ヘッダーの管理に問題があります。送信前にデータを圧縮するモジュールがないことを確認してください (例: apache2 の mod_deflate)。HTTP 回答を送信するときは、header("Content-Length: " . strlen($source)); で長さを示します。圧縮を使用する場合、この長さは False です。Android ブラウザがまだデータを待っている可能性があり、最後に画像が破損していると判断して閉じます。

それがあなたの問題である場合は、このスクリプトで圧縮をシャットダウンすることを試みることができます (例: apache2 : apache_setenv('no-gzip', '1');) または Content-Length 情報を送信しないことを試みることができます。

編集: Android がイメージを管理しやすくするために、真の MIME タイプを使用する必要があります。

于 2013-03-08T07:24:58.197 に答える
0

発生しているように見えるのは、Android デバイスが POSTED ロジック プロセスであるプロセスを「再要求」しようとしているということです。どうやら、デバイス ダウンロード マネージャーは何も POST しません。

私が思いついた解決策は、セッションを使用して情報を保存することでした

于 2013-08-24T14:50:56.677 に答える