我有一个JavaScript函数,用于读取Excel文件并返回我的对象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文件中。
我该怎么办?
编辑我: 我想我做错了什么,因为我创建的文件,但奇怪的字符,只有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);
编辑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);
我刚刚才知道如何让原文件名。
编辑III(发送文件名): 角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);
它完美!
如果需要发送'ArrayBuffer'到服务器,'String.fromCharCode()'调用的目的是什么?请参阅http://stackoverflow.com/questions/37491759/trying-to-pass-todataurl-with-over-524288-bytes-using-input-type-text/37491895#37491895 – guest271314
也许没有必要String.fromCharCode() 。我会尝试删除该代码。谢谢!!! –
向服务器发送''元素的'.files [0]'属性。 '.value'是一个字符串,'C:\\ fakepath'。为什么你在'php'调用'json_decode'? ''''在'php'删除第一行''publicDataServices.sendData(“http://gnsys.local/publico/test/up”,document.getElementById(“fileContent”)。files [0])''。 – guest271314