我正在开发一个JavaScript上传器,因为我需要上传大于max_upload_size的文件,我无法修改该全局PHP参数。 所以,我以为我可以得到一个文件,将其分开并通过HTTP将部件上传到我的网络服务器中。
这是上传代码:
subir.php
<html>
<head></head>
<script type="text/javascript">
var procesadas = 0;
function readSingleFile(e) {
var reintentos = 1;
var file = e.target.files[0];
var name = e.target.value;
if (!file) {
return;
}
var reader = new FileReader();
reader.onload = function(e) {
var contents = e.target.result;
sendHTTPRequest(contents, name);
};
//reader.readAsBinaryString(file);
reader.readAsText(file);
}
function displayContents(contents) {
var element = document.getElementById('file-content');
element.innerHTML = contents;
}
/*
* Recibe el contenido del archivo. Lo sube en porciones de N bytes
* i es el contador de porciones
* i + 1 / 1024 es el numero de la porcion
* temp.length / 1024 es la cantidad de porciones
*/
function sendHTTPRequest(contents, nombre) {
var n = 1024;
var temp = contents.split("");
var porciones = parseInt(temp.length / n);
var envio = "";
for (i=0;i<temp.length;i=i+n) {
envio = "";
for (j=0;j<n;j++) {
if (temp[i+j]!=null) {
envio = envio+temp[i+j];
}
}
sendPortion(envio, (i+1)/n, porciones, nombre);
}
}
function sendPortion(envio, orden, porciones, nombre) {
var xmlhttp = new XMLHttpRequest();
var formData = new FormData();
var element = document.getElementById('file-content');
var sent = document.getElementById('registro_eventos');
var reintentos = 1;
formData.append('archivo', envio);
formData.append('orden', parseInt(orden));
formData.append('porciones', porciones);
formData.append('nombre', nombre);
xmlhttp.open("POST","procesar.php",true);
xmlhttp.send(formData);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4) {
if (xmlhttp.responseText.trim()=="OK") {
procesadas = procesadas + 1;
element.innerHTML = "<hr>Estado " + procesadas + " de " + (porciones + 1);
if (procesadas>porciones) {
archivoCompleto(nombre);
}
}
}
}
}
function archivoCompleto(nombre) {
procesadas = 0;
var xmlhttp = new XMLHttpRequest();
var formData = new FormData();
formData.append('nombre', nombre);
xmlhttp.open("POST","generar.php",true);
xmlhttp.send(formData);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4) {
alert(xmlhttp.responseText);
}
}
}
function registrareventos() {
document.getElementById('file-input')
.addEventListener('change', readSingleFile, false);
}
</script>
<body onload="registrareventos();">
<input type="file" id="file-input" />
<h3>Contents of the file:</h3>
<pre id="file-content"></pre>
<pre id="registro_eventos"></pre>
</body>
</html>
这是处理每个单独上传并将其存储在数据库表中的代码:
procesar.php
<?php
include("include.php");
$db = new MysqliDb(BD_HOST, BD_USER, BD_PASSWORD, BD_NAME);
$insertDatos = array(
'nombrefisico' => str_replace('C:\fakepath\\', "", $_POST['nombre']),
'porcion' => $_POST['orden'],
'contenido' => $_POST['archivo'],
);
//$file = fopen("arch\archivo".$_POST['orden'].".txt", 'wb');
$log = fopen("arch\log.txt", "ab");
$log2 = fopen("arch\log2.txt", "ab");
fwrite($log2, $db->getLastError()."\n");
fwrite($log2, "Para escribir;".$_POST['orden']."\n");
//$res = fwrite($file, $_POST['archivo']);
$res = $db->insert("buffer_upload", $insertDatos);
if ($res!=false) {
fwrite($log, $_POST['orden'].";".$res."\n");
echo("OK");
} else {
fwrite($log, $_POST['orden'].";error\n");
echo("NOK");
}
?>
这是我存储零件的数据库表的定义:
CREATE TABLE IF NOT EXISTS `buffer_upload` (
`id` int(11) NOT NULL,
`nombrefisico` varchar(255) COLLATE latin1_general_ci NOT NULL,
`porcion` int(11) NOT NULL,
`contenido` blob NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
当所有部分都已上传时,我调用了generar.php。此代码读取存储在数据库中的所有部分,并使用原始物理名称在Web服务器中生成文件:
generar.php
<?php
include("include.php");
$db = new MysqliDb(BD_HOST, BD_USER, BD_PASSWORD, BD_NAME);
$db->where('nombrefisico', str_replace('C:\fakepath\\', "", $_POST['nombre']));
$db->orderBy('porcion', 'asc');
$result = $db->get("buffer_upload");
$archivo = fopen(str_replace('C:\fakepath\\', "", $_POST['nombre']), "ab");
foreach ($result as $r) {
fwrite($archivo, $r['contenido']);
}
?>
这适用于纯文本或CSV文件,但当我尝试上传PDF时,这就是我得到的:
原始PDF
%PDF-1.3
3 0 obj
<</Type /Page
/Parent 1 0 R
/Resources 2 0 R
/Contents 4 0 R>>
endobj
4 0 obj
<</Filter /FlateDecode /Length 383>>
stream
xœ}TAnA¼ï+ú‡-ìv·íæ Žh>0"›(ˆ$«ß§'°bÃbŸFêšrWÕxª–Ï;B·òs÷n)o>rq•å¶|X¶“QÑZ1p/ ËMyõþt¸9<~½_¿—ãzZË—õx\ïž^—åÛ“Cµ˜u?“>=ŸN?o‹‹v?¿ì4§w…÷Â^öÕ·ÇéPnwn =£µ—è 3ZAõºéÖpòhh#F
žpg#TÅÄ’™:jÆ6‡¦˜ Ä1›ç}ú—môÜ`-a+,¶Íì°8o®,®‚ž«ŠÊ±ò:Ð=–&M2JÛE¨ÿǶš±Æ0‰µ¹i’°ç/â ìh‰ï΋zÍî
=Y‡n‰´>P=6¦sÏå*‰ïVÝŽb¶_„zíÛÖciÖÀ{ž'¾ÍÁ‰ogô³]ÒM…§‰o÷‹P¯Ù³Ô$ñ=f›&Ò† ¢Q8ü¹·×"môÖÛ2i/TIÄÆ^εý<I
endstream
endobj
1 0 obj
<</Type /Pages
/Kids [3 0 R ]
/Count 1
/MediaBox [0 0 595.28 841.89]
>>
endobj
5 0 obj
<</Filter /FlateDecode /Length 364>>
stream
xœ]RËnƒ0¼ó>¦‡L‚%„DI8ô¡Ò~ %E*ràï»»vÒªHXã±gvVk?/¥îá¿™±©`]¯[óx5
ˆ3\zíÉP´}³¸¯ÍPOžâjJÝ^’øïx6/f›¬Ïðàù¯¦Óë‹Ø|æî«ë4}à z—¦¢…}žëé¥@ø,Û–- ž÷˺EÍïuò^Ú,ÍØÂ<Õ
˜Z_ÀK‚ IQ¤èößYdçîïÕCK€_ê%q„8>à!J"V!2&bGÄ£%r"H¢¬DîÈ\}2EL1n¥ºh¾jƒå– eä»"a*H¬‹ØÕ:ÞÛdá˜î„9cÅüŽ[ÈX1~²¼"œ3¿gÏãÑò;Oâ•õ<r_ì)-ï<%açI9•ó¤¶•ó¤œª °8vÝs·4z0÷97WcpÄüªx¶4Õ^ÃýáMãD*ú
¶©
endstream
endobj
6 0 obj
<</Type /Font
/BaseFont /Helvetica
/Subtype /Type1
/Encoding /WinAnsiEncoding
/ToUnicode 5 0 R
>>
endobj
2 0 obj
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font <<
/F1 6 0 R
>>
/XObject <<
>>
>>
endobj
7 0 obj
<<
/Producer (FPDF 1.81)
/CreationDate (D:20160115163041)
>>
endobj
8 0 obj
<<
/Type /Catalog
/Pages 1 0 R
>>
endobj
xref
0 9
0000000000 65535 f
0000000540 00000 n
0000001174 00000 n
0000000009 00000 n
0000000087 00000 n
0000000627 00000 n
0000001061 00000 n
0000001278 00000 n
0000001354 00000 n
trailer
<<
/Size 9
/Root 8 0 R
/Info 7 0 R
>>
startxref
1403
%%EOF
这是上传的文件:
%PDF-1.3
3 0 obj
<</Type /Page
/Parent 1 0 R
/Resources 2 0 R
/Contents 4 0 R>>
endobj
4 0 obj
<</Filter /FlateDecode /Length 383>>
stream
x�}TAnA��+��-�v��� �h>0"�(�$�ߧ'�b�b�F��rW�x���;B��s�n)o>rq���|X��Q�Z1p/�My��t�9<~�_���zZ˗�x\��^����C��u?�>=�N?o��v?��4�w��^�շ��Pnwn =���� �3ZA����p�hh#F
�pg#T����:j�6��� �1��}��m��`-a+,����8o�,�����ʱ�:�=�&M2�J�E���Ƕš��0����i���/� �h����z��
=Y�n��>P=6�s��*��Vݎb�_�z���ci��{�'����og��]�M����o��P�ٳ�$�=f�&҆�Q8����"�m���2i/TI��^ε�<I
endstream
endobj
1 0 obj
<</Type /Pages
/Kids [3 0 R ]
/Count 1
/MediaBox [0 0 595.28 841.89]
>>
endobj
5 0 obj
<</Filter /FlateDecode /Length 364>>
stream
x�]R�n�0��>��L�%�DI�8���~ �%E*r�ﻻvҪHX��gvVk?/���Ῑ��`]�[�x5
�3\z��P�}����PO���j�Jݍ^���x6/f������������|����4}� z�����}����@�,ۖ-��˺E�u�^�,���<�
�Z_�K� IQ����Yd����C�K�_�%q�8>�!J"V!2&bGģ%r"H��D���\}2EL1n��h�j���e��"a*H����:��d����9c���[�X1~��"�3�g��Ñ�;O���<r_�)-�<%a�I9��8v�s�4z0�97Wcp���x�4�^���M�D*�
��
endstream
endobj
6 0 obj
<</Type /Font
/BaseFont /Helvetica
/Subtype /Type1
/Encoding /WinAnsiEncoding
/ToUnicode 5 0 R
>>
endobj
2 0 obj
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font <<
/F1 6 0 R
>>
/XObject <<
>>
>>
endobj
7 0 obj
<<
/Producer (FPDF 1.81)
/CreationDate (D:20160115163041)
>>
endobj
8 0 obj
<<
/Type /Catalog
/Pages 1 0 R
>>
endobj
xref
0 9
0000000000 65535 f
0000000540 00000 n
0000001174 00000 n
0000000009 00000 n
0000000087 00000 n
0000000627 00000 n
0000001061 00000 n
0000001278 00000 n
0000001354 00000 n
trailer
<<
/Size 9
/Root 8 0 R
/Info 7 0 R
>>
startxref
1403
%%EOF
正如你所看到的,二进制字符串似乎有问题,但我真的无法弄清楚我在哪里乱搞字符集。