PHP - fopen(): failed to open stream: Permission denied in...

 
Vista:
sin imagen de perfil

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:

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

fopen(): failed to open stream: Permission denied in...

Publicado por Gonzalo (615 intervenciones) el 05/11/2017 21:29:38
eso parece ser Linux.

aqui debes tomar en cuenta 2 cosas, si el directorio al que te refieres esta dentro del directorio var/www/html, si esta fuera de esta ruta va a estar complicado hacerle los cambios.

ahora bien, no es necesario estar dando los permisos cada vez que corres el script, simplemente, si alguien los puso ahi es que hay acceso 777, asi que no le veo el caso estar dandoles el acceso.

ahora bien, consulta el path de tu servidor web, confirma que efectivamente el directorio que buscas esta dentro del path de la pagina web, o quitate del problema y pon el path completo

var/www/html/pagina/directorio/archivo_del_que_se_trate.extencion

y 2, si lo que haces es quitar los accesos entonces si debes darlos cada vez que piden el archivo, si incluyes el path desde el root eso deberia quitar el problema.

espero sea de ayuda.

La mayoria de los cientificos son ateos (no creen en dios), sin embargo, todo lo que han hecho es fundamentar cientificamente todo lo que dice la biblia en el libro del genesis,
cientificos: se acumulo una gran cantidad de materia y hubo una gran explocion, Biblia: Hagase la luz (Genesis 3)
Cientificos: para que haya vida debe haber agua liquida, Biblia: el orden en que dios creo los seres vivos inicio precisamente en el agua (genesis,20)
para mi que las grandes hipotesis de la creacion que idearon estos cientificos no son mas que un simple plagio, tanto es asi que aun no pueden explicar como se genero la vida (Genesis 24)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
sin imagen de perfil

fopen(): failed to open stream: Permission denied in...

Publicado por JOSE MANUEL (10 intervenciones) el 06/11/2017 08:16:51
Hola Gonzalo.

Totalmente de acuerdo en que si ya se dieron permisos 0777 a las carpetas no hace falta reiterarlo en el algoritmo; he dado 0777 en todos los sitios posibles, aunque después de ejecutado el script los volvería a cambiar.

Es que no se que más hacer.
No se donde esta el fallo.
Por eso lo he subido al foro...a ver si alguien tiene "más luces" que yo.

He puesto la ruta absoluta de los archivos para probar tu teoría:

$to_read = 'C:\AppServ\www\IMPREST/archivosUp'; //Directorio desde donde se leen los archivos.
$to_write = 'C:\AppServ\www\IMPREST/archivosUp/chunk'; //Directorio donde se escribirán los archivos.

...Y arroja idéntico error.

No obstante esta teoría (de rutas absolutas) es válida ahora que estoy trabajando en local, pero no sería viable al subirlo a un servidor remoto; es decir, la ruta en remoto debe ser como la puse en el algoritmo inicial, so pena de tener que estar cambiando las rutas cada vez que cambias de servidor...este algoritmo es parte de un programa mayor.


------------------------------------------------------------------------------------------------

Dios existe y...quien mantenga lo contrario...que me lo demuestre.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

fopen(): failed to open stream: Permission denied in...

Publicado por Gonzalo (615 intervenciones) el 06/11/2017 16:49:05
ok, si el path esta completo entonces el error esta en otro lado.

aqui explicame una cosa, linux no maneja las unidades C, D o F, linux usa nombres en lugar de letras para las unidades, tu estas usando la Unidad C, asi que aqui hay una especie de contradiccion.

estas usando windows? entonces como es que estas usando el permiso 777 que es de linux?

dicho de otra forma, estamos hablando de agua y aceite, no tiene que ver una cosa con la otra.

salu2

me siento extraño, tengo 2 post que no me califican negativo

QUE ALGUIEN ME CALIFIQUE NEGATIVO POR FAVOOOOOOOR!.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

fopen(): failed to open stream: Permission denied in...

Publicado por JOSE MANUEL (10 intervenciones) el 06/11/2017 17:46:49
Vamos a ver.

Como ya dije, estoy trabajando en local con appserv como servidor.

El S.O. es windows 7. Pero esto no tiene nada que ver...

Los permisos 0777 es una reiteración (pues ya había dado permisos manualmente a las carpetas implicadas).
Hice esa reiteración porque ya no sabia que más hacer para que funcionase.
Los permisos 0777 se utilizan en lenguaje PHP (con chmod).

Solo da el problema con esta función cuando se procesan los archivos contenidos en to_read uno a uno mediante un foreach.

Si enviamos los archivos uno por uno, por POST lo procesa sin problemas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

fopen(): failed to open stream: Permission denied in...

Publicado por Gonzalo (615 intervenciones) el 06/11/2017 20:13:10
Hola don Jose.

por eso mencione que el SO parecia ser linux ya que los permisos para acceder a un folder se dan con ese codigo, por eso la confucion.

entonces solo queda ver si el path es correcto

o tal vez ahi esta el problema, php cree que esta usando linux, esa orden pudiera no aplicar para windows.

http://php.net/manual/es/function.chmod.php, aqui indican la relacion de este comando con Unix, que es similar a linux.

El parámetro mode consiste en tres componentes numéricos octales que especifican las restricciones de acceso para el propietario, el grupo de usuarios al que pertenece el propietario, y para todos los demás, en este orden. Un componente puede ser computado sumando los permisos necesarios para ese usuario objetivo base. El número 1 significa que se conceden derechos de ejecución, el número 2 significa que se puede escribir en el fichero, el número 4 significa que el fichero se puede leer. Sume estos números para especificar los derechos necesarios. Se puede leer más sobre los modos en sistemas Unix con 'man 1 chmod' y 'man 2 chmod'.

una nota:
Nota:

El usuario actual es el usuario bajo el que se ejecuta PHP. Probablemente no sea el mismo usuario que se utilize para el intérprete de comandos normal o el acceso FTP. EL modo puede ser cambiado sólo por el usuario al que pertenece el fichero en la mayoría de sistemas.

y lo ultimo que encontre:

about chmod,
Problably you have a local server to simulate your scripts before upload them to the server. No matter if you use Apache under windows or IIS , a chmod instruction like chmod($filename,O777) may not work because windows does not handle that kind of permission's format.

"probablemente usted tiene un servicio local simulando sus scripts antes de subirlos al servidor. no importa si usted usa Apache o windows o IIS, la instruccion chmod como chmod($filename,O777) pudieran no funcionar porque windows do maneja ese tipo de formato de permiso."

espero te sea de utilidad.

salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar