2017-02-21 40 views
2

У меня есть функция JavaScript, которая считывает файл первенствовать и вернуть мне объект ArrayBuffer в document.getElementById("content").value:Загрузить бинарный файл и сохранить его как Excel в сервере

<script type = "text/javascript"> 
     function readFile(files){ 
      console.log("DEntro de readFile"); 
      var reader = new FileReader(); 
      reader.readAsArrayBuffer(files[0]); 
      reader.onload = function(event){ 
       var arrayBuffer = event.target.result; 
       array = new Uint8Array(arrayBuffer); 
       binaryString = String.fromCharCode.apply(null, array); 
       document.getElementById("fileContent").value = event.target.result;  
      } 
     } 
    </script> 

Итак, я хотел бы знать, как можно Я отправляю этот объект ArrayBuffer на сервер и на сервере сохраняю этот ArrayBuffer в файле excel, создающем исходный Excel.

Что я могу сделать?

EDIT I: Я думаю, что я делаю что-то неправильно, потому что я создаю файл, но со странными персонажами и только 31 байт.

JavaScript:

function readFile(files){ 
     var reader = new FileReader(); 
     reader.readAsArrayBuffer(files[0]); 
     reader.onload = function(event){ 
      document.getElementById("fileContent").value = event.target.result;  
     } 

    } 

Угловая JS С помощью этой функции я отправить данные на сервер в формате JSON:

self.uploadFile = function(){ 
    var data = { 
     file : document.getElementById("fileContent").value, 
    }; 
    publicDataServices.sendData("http://gnsys.local/publico/test/up", data).then(function(response){ 
     switch(parseInt(response.result)){ 
      case 0: 
       console.log("OK!!!"); 
       break; 
      case 3: //Error de Sistemas 
       console.log("testControllers.js::uploadFile: Error de sistemas"); 
       break;        
     } 
    }); 
} 

PHP:

$params = json_decode(file_get_contents('php://input'),true); 
    $property = new PropertyReader(); 
    $fileRoute = $property->getProperty("scripts.ruta.querys"); 
    $fileName = $fileRoute . "prueba.xls"; 

    $input = fopen('php://input', 'rb'); 
    $file = fopen($fileName, 'wb'); 

    stream_copy_to_stream($input, $file); 
    fclose($input); 
    fclose($file); 

Edit II (это работает!):

Угловая JS:

self.uploadFile = function(){ 
    publicDataServices.sendData("http://gnsys.local/publico/test/up", document.getElementById("file").files[0]).then(function(response){ 
     switch(parseInt(response.result)){ 
      case 0: 
       console.log("OK!!!"); 
       break; 
      case 3: //Error de Sistemas 
       console.log("testControllers.js::uploadFile: Error de sistemas"); 
       break;        
     } 
    }); 
} 

PHP:

$property = new PropertyReader(); 
    $fileRoute = $property->getProperty("scripts.ruta.querys"); 
    $fileName = $fileRoute . "prueba.xls"; 

    $input = fopen('php://input', 'rb'); 
    $file = fopen($fileName, 'wb'); 

file_get_contents and file_put_contents 
     stream_copy_to_stream($input, $file); 
     fclose($input); 
     fclose($file); 

Я просто только знать, как получить оригинал имя файла.

Edit III (отправка имя файла): Угловые ЯШ:

self.uploadFile = function(){ 
     var promise = $q.defer(); 
     var headers = { 
      "file-name" : document.getElementById("file").files[0].name 
     } 
     $http.post("http://gnsys.local/publico/test/up", document.getElementById("file").files[0], {headers:headers}) 
     .success(function(response, status, headers, config){ 
      promise.resolve(response); 
      console.log("resultado: " + response.result); 
     }) 
     .error(function(data){ 
      //Error de sistemas 
      console.log("Error en sendData: " + data) 
     }) 

     return promise.promise;  
} 

PHP:

$property = new PropertyReader(); 
    $fileRoute = $property->getProperty("scripts.ruta.querys"); 
    $fileName = $fileRoute . "prueba.xls"; 
    //With this foreach we get all the headers so I can detect which i the right header to get the file name 
    foreach (getallheaders() as $name => $value) { 
     $log->writeLog(get_class($this) . "::" . __FUNCTION__ . ": name: " . $name . " value: " . $value); 
    } 

    $input = fopen('php://input', 'rb'); 
    $file = fopen($fileName, 'wb'); 

    stream_copy_to_stream($input, $file); 
    fclose($input); 
    fclose($file); 

Он отлично работает!

+1

Какова цель 'String.fromCharCode()' вызов, если требование заключается в отправке 'ArrayBuffer' на сервер? См. Http://stackoverflow.com/questions/37491759/trying-to-pass-todataurl-with-over-524288-bytes-using-input-type-text/37491895#37491895 – guest271314

+0

Может быть, не обязательно String.fromCharCode() , Я попытаюсь удалить этот код. Благодаря!!! –

+1

Отправить '.files [0]' свойство '' element to server. '.value' - это строка,' C: \\ fakepath'. Почему вы называете 'json_decode' на' php'? 'publicDataServices.sendData (" http: //gnsys.local/publico/test/up ", document.getElementById (" fileContent "). files [0])', на 'php' удалять первую строку. – guest271314

ответ

1

Не нужно преобразовывать File объект в ArrayBuffer. Вы можете POSTFile объект на сервер и использовать fopen(), "php://input", file_get_contents() на php см Trying to Pass ToDataURL with over 524288 bytes Using Input Type Text

+0

Мне нужно прочитать файл excel и отправить его на сервер, но я не могу использовать POST, мне нужно отправить поток. –

+0

_ "но я не могу использовать POST, я должен отправить поток" _ Что вы подразумеваете под "отправить поток"? Как файл отправляется на сервер? – guest271314

0

При отправке файла блоб с помощью сервиса AngularJS $ HTTP, важно установить заголовок типа содержимого в примитивное значение undefined.

var config = { headers: { 'Content-Type': undefined } }; 

$http.post(url, file[0], config).then(function(response) { 
    var data = response.data; 
    var status = response.status; 
    console.log("status: ", status); 
}); 

Обычно служба $ HTTP устанавливает тип содержимого заголовка к application/json.Установив заголовок типа контента на undefined, XHR Send Method установит заголовок на соответствующее значение.