2016-07-25 8 views
3

ファイルをエンコードしていない、とajaxrequestjspdfとhtml2canvasで生成されたファイルをbase64でエンコードする方法は?

正しい方法は何かを実行されることはありませんどちらもが、エラーを生成し、ない私は付属のコードで生成された文書のエンコードをしようとしているが、何も起こりませんか?

html2canvas(document.getElementById("workAreaModel"), { 
    onrendered: function(canvas) 
    { 
     var img = canvas.toDataURL("image/png"); 
     var doc = new jsPDF("l", "pt", "letter"); 
     doc.addImage(img, 'JPEG',20,20); 
     var fileEncode = btoa(doc.output()); 
     $.ajax({ 
       url: '/model/send', 
       data: fileEncode, 
       dataType: 'text', 
       processData: false, 
       contentType: false, 
       type: 'GET', 
       success: function (response) { 
        alter('Exit to send request'); 
       }, 
       error: function (jqXHR) { 
        alter('Failure to send request'); 
       } 
      }); 
    } 
}); 
+0

'doc.output()'は何を返すのですか? ''/model/send ''は '' GET'要求を期待していますか? – guest271314

+0

デバッグのステップと出力がなければ、これは "なぜこのコードが動作しないのですか"という質問として閉じられる危険性があります。 – danh

答えて

5

まず、jsPDFはJavaScriptでネイティブではない、あなたは適切なソースが含まれている、および他の参考文献にのぞき見をした後、私は(あなたがdoc.outputを変換するbtoa()関数を必要としないと思わせます)、ちょうどこのように指定します。

doc.output('datauri'); 

第二に、base-64でエンコードされた文字列が'+''/'を含めることが可能である、'='、彼らはURL安全ではありません文字、あなたそれらを置き換える必要があるか、ajaxを処理できません。

しかし、自分の経験では、ファイルのサイズによっては、地獄になるのは簡単です!文字のGETメソッドの長さ制限に達する前に、エンコードされた文字列がWeb開発ツールを最初にクラッシュさせ、デバッグが難しくなります。

私の提案、あなたのjqueryのコード

processData: false, 
contentType: false 

によると多分ファイルまたはのBlobオブジェクトを送信するために、共通の設定である、 がちょうどjsPDFの表情を持っている、あなたのデータを変換するフィットネスエクササイズですブロブへ:

doc.output('blob'); 

ので、完全にあなたのコードを修正:

var img = canvas.toDataURL("image/png"); 
var doc = new jsPDF("l", "pt", "letter"); 
doc.addImage(img, 'JPEG',20,20); 
var file = doc.output('blob'); 
var fd = new FormData();  // To carry on your data 
fd.append('mypdf',file); 

$.ajax({ 
    url: '/model/send', //here is also a problem, depends on your 
    data: fd,   //backend language, it may looks like '/model/send.php' 
    dataType: 'text', 
    processData: false, 
    contentType: false, 
    type: 'POST', 
    success: function (response) { 
    alter('Exit to send request'); 
    }, 
    error: function (jqXHR) { 
    alter('Failure to send request'); 
    } 
}); 

、あなたのバックエンドにPHPを使用している場合、あなたはあなたのデータ情報を見ている可能性があり:

echo $_FILES['mypdf']; 
+1

ありがとう、私はdoc.output( 'BLOB')を使用する必要があります。 –

+0

Carr、なぜあなたはURLのエンコードステップを逃していますか?それは、URLが保存されていることですか? – Arendax

+0

@Arendax、 'doc.output( 'datauri')'はすでにbase64でエンコードされたバイナリデータ文字列を提供します。 – Carr

関連する問題