fopen(): failed to open stream: Permission denied in...
Publicado por JOSE MANUEL (10 intervenciones) el 05/11/2017 09:12:35
Buenos días.
Tengo el siguiente problema que me esta trayendo loco...
He creado una función en PHP que realiza la partición de archivos csv.
Su objetivo es partir los archivos csv a otros mas pequeños.
Si le enviamos por POST manualmente (mediante formulario y uno a uno) los archivos, funciona sin problema.
Ahora bien, si recibe secuencialmente los archivos contenidos en un array (enviados por POST uno a uno mediante un foreach) la función arroja el error " fopen(): failed to open stream: Permission denied in... ".
Estoy trabajando en local con appserv. Se han dado permisos 0777 a las carpetas implicadas manualmente y además, como se puede ver, la función reitera estos permisos.
if (($handle = fopen($to_read,'r')) !== FALSE) {...se abre en solo lectura porque ese directorio solo tiene que leerlo; al final tenemos: file_put_contents($to_write.'_'.$part.'.csv',$header.$chunk); que es donde se escribirán las partes obtenidas.
Ya no se donde puede estar el fallo... envío el código explicado:
Tengo el siguiente problema que me esta trayendo loco...
He creado una función en PHP que realiza la partición de archivos csv.
Su objetivo es partir los archivos csv a otros mas pequeños.
Si le enviamos por POST manualmente (mediante formulario y uno a uno) los archivos, funciona sin problema.
Ahora bien, si recibe secuencialmente los archivos contenidos en un array (enviados por POST uno a uno mediante un foreach) la función arroja el error " fopen(): failed to open stream: Permission denied in... ".
Estoy trabajando en local con appserv. Se han dado permisos 0777 a las carpetas implicadas manualmente y además, como se puede ver, la función reitera estos permisos.
if (($handle = fopen($to_read,'r')) !== FALSE) {...se abre en solo lectura porque ese directorio solo tiene que leerlo; al final tenemos: file_put_contents($to_write.'_'.$part.'.csv',$header.$chunk); que es donde se escribirán las partes obtenidas.
Ya no se donde puede estar el fallo... envío el código explicado:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function partir () { //Partira uno a uno los archivos recibidos por POST.
#Recordamos variables y creamos rutas:
$to_read = _PS_truncate_ . '/archivosUp'; //Directorio desde donde se leen los archivos.
$to_write = _PS_truncate_ . '/archivosUp/chunk'; //Directorio donde se escribirán los archivos.
chmod ($to_read, 0777); //Damos todos los permisos a las carpetas de lectura y escritura.
chmod ($to_write, 0777);
$tamaño= $_POST ['Kb']; // Recogemos el tamaño de las partes...
$size =($tamaño * 1000); // 300000 bytes son cerca de 300kb. En el formulario se introduce en Kb y aquí lo transformamos en bytes.
// Opciones No editables
$done = false;
$part = 0;
if (($handle = fopen($to_read,'r')) !== FALSE) {
$header = fgets($handle);
while ($done == false) {
$locA = ftell($handle); // Obtiene la ubicación actual. COMIENZO
fseek($handle, $size, SEEK_CUR); // Saltar la longitud de $ size desde la posición actual
$tmp = fgets($handle); // Leer hasta el final de la línea. Queremos líneas completas
$locB = ftell($handle); // Obtiene la ubicación actual. FIN
$span = ($locB-$locA);
fseek($handle, $locA, SEEK_SET); // Saltar al inicio de este pedazo
$chunk = fread($handle,$span); // Lee, en modo binario seguro (fread), el trozo entre START y END
file_put_contents($to_write.'_'.$part.'.csv',$header.$chunk); //Escribe una cadena a un fichero (file_put_contents) formado como primer parametro por el fichero donde se escribe la información: ($to_write), guion bajo (_), la parte del csv en cuestión ($part), formato csv (.csv); como segundo parametro la información a escribir (data) encadenando $header y $chunk (lectura segura del archivo binario).
$part++;
if (strlen($chunk) < $size) $done = true; //Si la longitud del string (strlen) es menor que el tamaño indicado (Size) $done cambia a True y temina el while...
}
fclose($handle);
}
} //Cierra funcion partir.
Valora esta pregunta
0