无法使用JavaScript上传文件

时间:2016-01-26 12:04:40

标签: javascript php mysql file-upload

我正在开发一个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

正如你所看到的,二进制字符串似乎有问题,但我真的无法弄清楚我在哪里乱搞字符集。

0 个答案:

没有答案