上传二进制文件并将其像Excel一样保存在服务器中
我有一个JavaScript函数,它读取一个excel文件,并在document.getElementById("content").value
返回一个对象ArrayBuffer。value:
<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。
我能做什么?
编辑我:我想我做错了什么,因为我创build的文件,但奇怪的字符,只有31个字节。
JavaScript的:
function readFile(files){ var reader = new FileReader(); reader.readAsArrayBuffer(files[0]); reader.onload = function(event){ document.getElementById("fileContent").value = event.target.result; } }
Angular 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);
编辑II(它的工作!):
Angular 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);
我只是知道如何获得原始的文件名。
编辑III(发送文件名): Angular js:
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);
它完美的作品!
没有必要将File
对象转换为ArrayBuffer
。 您可以将File
对象发布到服务器,并在php
使用fopen()
, "php://input"
, file_get_contents()
,请参阅尝试通过ToDataURL超过524288字节使用inputtypes文本
使用AngularJS $ http服务发送文件blob时,将内容types头设置为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服务通常将内容types头部设置为application/json
。 通过将内容types标题设置为undefined
, XHR发送方法将标题设置为适当的值。
- 具有dynamic表格和列的多个表格网格
- 将Angular Kendo UI网格导出到Excel
- 如何阅读一个Excel工作表,并将其存储在一个Java脚本数组中,并将其显示为一个HTML表格
- 在引用的单元格更新后,Wijmo Flexsheet公式不会重新评估
- 如何parsing/读取已存在于服务器上的AngularJS中的excel文件(.xls或.xlsx)?
- Excel to Javascript – 忽略从Excel复制的列中的新行字符
- 如何保持数据过滤和从angular度ui网格sorting和导出?
- 我正在用angularjsdevise一个表,并在excel中为每一列提供多文本过滤选项
- Windows 10浏览器上传 – 错误的mimetype