Как правильно разбить файл на blob's (js) и собрать на сервере ?

trava

Новичок
OS Win, denver

Делаю так :
1. blob = file.slice(start, end, type);
2. reader.readAsBinaryString(blob);
3. onloadend : blob = evt.target.result;
4. ajax :
$.ajax({
type: "POST",
url: url,
data: blob,
dataType: "json",

На сервере собираю все части в одно целое и получаю размер больше чем оригинал.
С текстовыми файлами все ОК, а бинарные типа картинок не собираются, похоже проблема с
readAsBinaryString. Вообщем кто сталкивался хелп мучаю уже дня 3 (=.
 

cDLEON

Онанист РНРСlub
эм.... А что в blob лежит при отсылке ? Откуда там json ?
 

trava

Новичок
в blob лежит кусок файла.
думаю будет проще что-нить закинуть для примера :

HTML:
    <input type="file" id="files" name="file" />         
    <div id="byte_content"></div>
Код:
        (function () {
     
            function send(e){
         
                var files = $("#files").files;             
                var files = e.target.files;
                if (files.length != true) {
                    console.log('err length');
                }
             
                var file = files[0];
             
                var end = files[0].size - 1;             
                var blob = file.slice(0, end, file.type);
             
                var reader = new FileReader();                             
                reader.readAsBinaryString(blob); 
             
                var data = {}
                data.blob = blob;
                data.text = "num part"; 
             
                reader.onloadend = function(e) {
             
                    if (e.target.readyState == FileReader.DONE) {
                 
                        data.bin = e.target.result;                     
                        console.log("send");                                             
                     
                        $.ajax({         
         
                            type: "POST",
                            url: "upload_script.php",
                            data: JSON.stringify(data),                         
                            dataType: "json",             
                            timeout: 5000,                         
                            success: function(data) {
                                                                                     
                                console.log("all OK, return");
                            },
                            error: function(request, status, err) {
                                         
                                console.log(status);
                            }                     
                        });                     
                    }
                }
         
            };
         
         
 
            $("#files").bind('change', function(e) {                     
                send(e);             
            }); 
     
        }());
PHP:
    mb_internal_encoding("UTF-8");
 
 
    $obj = file_get_contents("php://input");
    $arr = json_decode($obj, true);
 
    $handle = fopen('tmp/test.dat', "w");

 
    if ($handle == true) {
             
        fwrite($handle, $arr['bin']);         
        fclose($handle);                         
 
        $data['success'] = true;     
    } else {
        $data['success'] = false;     
    }
 
    print(json_encode($data));
    die();
 
Последнее редактирование:

riff

Новичок
А так: ? (они тебе кодировку бьют)
Код:
    data.bin = e.target.result;
    data.bin = window.btoa(data.bin); //<-------
PHP:
    $bin = $arr['bin'];
    $bin = base64_decode($bin);
    fwrite($handle, $bin);
 

trava

Новичок
А так: ? (они тебе кодировку бьют)
Код:
    data.bin = e.target.result;
    data.bin = window.btoa(data.bin); //<-------
PHP:
    $bin = $arr['bin'];
    $bin = base64_decode($bin);
    fwrite($handle, $bin);
спасибо, работает. тоже думал что что-то с кодировкой, теперь все встало на свои места :)
 

riff

Новичок
Кстати, чего-то я тупанул с ответом, правильным ответом был бы "нафига ты так, через ж., делаешь".
Сегодня полез в свой аякс.js, а там обнаружился FormData, про который я забыл.

Код:
var data = new FormData(my_form); //my_form - это HTMLFormElement, а не объект jQuery  
//data.append( 'my_var', 'my_value'); //дополнительные ключ-значение по желанию

$.ajax({
  url: 'script.php',
  type: 'POST',
  dataType: "json",
  data: data,
  processData: false,
  contentType: false
}).done(function(result){
    alert(result);
  }
);
 
Последнее редактирование:

trava

Новичок
Кстати, чего-то я тупанул с ответом, правильным ответом был бы "нафига ты так, через ж., делаешь".
Сегодня полез в свой аякс.js, а там обнаружился FormData, про который я забыл.

Код:
var data = new FormData(my_form); //my_form - это HTMLFormElement, а не объект jQuery 
//data.append( 'my_var', 'my_value'); //дополнительные ключ-значение по желанию

$.ajax({
  url: 'script.php',
  type: 'POST',
  dataType: "json",
  data: data,
  processData: false,
  contentType: false
}).done(function(result){
    alert(result);
  }
);
неужели "это" может быть на продакшене ?
ответ неверный говорили про bolb's.
 
Сверху