3

(.jpg、.ai、.pdf、.flv、.psd ....など) のドラッグ アンド ドロップ アップローダがあります。

ファイルをバイナリとして読み取り、jquery 投稿で文字列を送信しています。

function importZoneDrop(evt) {
    evt.stopPropagation();
    evt.preventDefault();

    var files = evt.dataTransfer.files; // FileList object.

    // files is a FileList of File objects. List some properties.
    for (var i = 0, f; f = files[i]; i++) {
        var start = 0;
        var stop = files[0].size - 1;
        var reader1 = new FileReader();
        var reader2 = new FileReader();
        var ext = f.name.substring(f.name.indexOf(".")+1);
        if(ext == "JPEG" || ext == "jpeg" || ext == "JPG"){
            ext ="jpg";
        }

        reader1.onload = (function(theFile) {
            return function(e) {
              // Render thumbnail.
              $("#import-drop-zone").append('<img src="'+e.target.result+'" />');
            };
         })(f);

        reader2.onloadend = function(evt) {
          if (evt.target.readyState == FileReader.DONE) { // DONE == 2
            $.post("/process/upload.php",{"blob":evt.target.result,"extension":ext},function(data){
                console.log(data);
            });
          }
        };

        reader1.readAsDataURL(f);
        var blob = f.slice(start, stop + 1);
        reader2.readAsBinaryString(f);
    }
  }

これは機能し、ファイルを送信します。次に文字列を取得し、file_put_contents を使用して書き込みます。

$extension = $_POST['extension'];
$file = $_POST['blob'];//sent from jquery post
$filePath = "../_temp/monkey.".$extension;

file_put_contents($filePath,$file);
if(file_put_contents($filePath,$file)){
    echo json_encode("it worked");
}else{
    echo json_encode("it failed");
}

これにより、ファイルが正常に書き込まれます。しかし、ファイルは機能しません。壊れています。

私は何を間違っていますか?

4

1 に答える 1

4

を使用する必要がありますbase64_decode

file_put_contents($filePath, base64_decode($file));

現在、データを 2 回書き込んでいることに注意してください。しないでください。

if (file_put_contents($filePath, base64_decode($file))) {

結構です

編集

また、バイナリ ファイルを直接アップロードする方が効率的であることにも何の価値もありませんbase64_decode。このようなもの:

var xhr  = new XMLHttpRequest(),
    data = new FormData();

data.append("file", f); // You don't need to use a FileReader
// append your post fields

// attach your events
xhr.addEventListener('load', function(e) {});
xhr.upload.addEventListener('progress', function(e) {});

xhr.open('POST', '/process/upload.php', true);
xhr.send(data);

残りのイベントは、ここでいくつかのサンプルとともに表示できます

于 2012-09-19T15:05:01.367 に答える