Autor
|
Tema: Uploader de archivos REMOTO (Leído 5,310 veces)
|
lipman
|
Buenas, quiero hacerme un uploader de archivos remoto y por lo que he leido se puede hacer con la función copy() pero me da problemas. Por ejemplo, pongo en el servidor (local) esto: $archivo = "http://es.php.net/images/php_snow_2008.gif"; $directorio = "ejemplo.gif"; copy($archivo, $directorio);
Y funciona, se copia esa imagen en el directorio donde tengo el script como ejemplo.gif. Sin embargo, si lo subo a un servidor (el de mi web) me da el siguiente error: Warning: copy() [function.copy]: URL file-access is disabled in the server configuration in /homepages/44/d217001018/htdocs/prueba/prueba.php on line 10 Warning: copy( http://es.php.net/images/php_snow_2008.gif) [function.copy]: failed to open stream: no suitable wrapper could be found in /homepages/44/d217001018/htdocs/prueba/prueba.php on line 10 ¿Que es lo que sucede? Otra cosa. Me gustaria tambien poner algo así como una barra para saber el progreso y la velocidad a la que va. ¿Cómo podría hacerlo? ¿Cambio de función? Saludos
|
|
|
En línea
|
|
|
|
eLank0
eLhAcKeR r00Lz
Desconectado
Mensajes: 1.062
|
Hola, Podrías usar las funciones FTP de PHP para subir los archivos remotamente: <?php
$conn = ftp_connect('servidor');
$log = ftp_login($conn, 'usuario','contraseña');
if (($conn) && ($log)) {
$local = $_FILES['archivo']['nombre_archivo'];
$remoto = $_FILES['archivo']['nombre_archivo_temporal']; //durante la transmision
if (is_uploaded_file($remoto)) { if(ftp_put($conn, $local, $remoto, FTP_BINARY)) { //Archivo subido correctamente } else { //Error al subir el archivo } } else { //Error }
}
ftp_close($conn);
?> En el ejemplo he supuesto que envias el archivo por formulario. Es mejor usar funciones específicas para lo que uno quiere hacer, y si ya están hechas pues mucho mejor Salu2
|
|
« Última modificación: 31 Diciembre 2008, 01:56 am por eLank0 »
|
En línea
|
|
|
|
|
lipman
|
Hola, Podrías usar las funciones FTP de PHP para subir los archivos remotamente: <?php
$conn = ftp_connect('servidor');
$log = ftp_login($conn, 'usuario','contraseña');
if (($conn) && ($log)) {
$local = $_FILES['archivo']['nombre_archivo'];
$remoto = $_FILES['archivo']['nombre_archivo_temporal']; //durante la transmision
if (is_uploaded_file($remoto)) { if(ftp_put($conn, $local, $remoto, FTP_BINARY)) { //Archivo subido correctamente } else { //Error al subir el archivo } } else { //Error }
}
ftp_close($conn);
?> En el ejemplo he supuesto que envias el archivo por formulario. Es mejor usar funciones específicas para lo que uno quiere hacer, y si ya están hechas pues mucho mejor Salu2 No entiendo lo de: $local = $_FILES['archivo']['nombre_archivo']; $remoto = $_FILES['archivo']['nombre_archivo_temporal']; //durante la transmision
$local seria, la ruta del archivo que quiero subir no? por ejemplo: $local = " http://foro.elhacker.net/Themes/converted/images/spanish/search.gif";y remoto... no entiendo eso de temporal. Si lo que yo quiero es que se suba y se quede ahí xD. Con lo de respecto a la barra, no me voy a meter en más lenguajes de programación web por ahora asi que prefiero no liarme con eso xD ¿Podría saber la velocidad de subida a la que va a cada instante (o a cada segundos)? Un saludo y gracias
|
|
|
En línea
|
|
|
|
w0lfh4ck
Desconectado
Mensajes: 5
|
No entiendo lo de: $local = $_FILES['archivo']['nombre_archivo']; $remoto = $_FILES['archivo']['nombre_archivo_temporal']; //durante la transmision
$local seria, la ruta del archivo que quiero subir no? por ejemplo: $local = " http://foro.elhacker.net/Themes/converted/images/spanish/search.gif";y remoto... no entiendo eso de temporal. Si lo que yo quiero es que se suba y se quede ahí xD. Con lo de respecto a la barra, no me voy a meter en más lenguajes de programación web por ahora asi que prefiero no liarme con eso xD ¿Podría saber la velocidad de subida a la que va a cada instante (o a cada segundos)? Un saludo y gracias Hola, recuerda que para hacer un upload lo que generalmente se hace es enviar el archivo a subir a la carpeta de temporales.... de ahí el servidor copia o mueve (move_uploaded_file) al directorio que necesites... El problema tuyo es que no tienes los permisos necesarios para acceder a esa imagen y enviarla a temporales, ya que esa imagen no está en tu máquina... La forma que te dio el compañero eLank0 es simple, te conectas al FTP agarras la imagen, cierras y te vas.... Lo de los parámetros. La variable global FILE nos brinda 4 datos del archivo que se va a subir Por ejemplo: <input type="file" name="imagenes" /> $_FILE["imagenes"]["name"] = Me brinda el nombre del archivo, por ej: casa.jpg $_FILE["imagenes"]["type"] = El tipo MIME del archivo en este caso "images/jpeg" $_FILE["imagenes"]["tmp_name"] = La carpeta temporal a la que se encuentra en ese momento, por ej: "tmp/ajdhas545a" $_FILE["imagenes"]["size"] = El peso del archivo. Con esos datos validas lo necesario. Un saludo y espero haber cooperado con tu duda.
|
|
|
En línea
|
|
|
|
|
Erik#
Desconectado
Mensajes: 1.138
Gundam
|
En un uploader que hice hace meses use la funcion
|
|
|
En línea
|
|
|
|
Karman
|
fijate esta función: function xwUploadFile ($campo,$destino,$nombre,$aiext=null,$filetypes=array('image/jpeg','image/pjpg'),$maxfilesize=250000){ //Verificamos datos... if(($_FILES[$campo]['tmp_name']=="")||($_FILES[$campo]['name']=="")){ xwShowError(ERROR_BAD_ARGS); return null; } //Verificamos tamaño if(($_FILES[$campo]['size'] > $maxfilesize)||(!$_FILES[$campo]['size'])){ xwShowError(ERROR_INVALID_FILESIZE); return null; } //Verificamos Tipo... $validfiletype=false; foreach($filetypes as $types) if($_FILES[$campo]['type'] == $types) $validfiletype=true; if(!$validfiletype){ xwShowError(ERROR_INVALID_FILETYPE); return null; } //Comprobamos exista el archivo temporal en el servidor... //Si no existe la carpeta intentamos crearla... xwShowError(ERROR_FAIL_CREATEFOLDER); return null; } $nombrearchivo = "$destino/$nombre"; if($aiext!=null){//generamos nombre de archivo (no utilizaremos el enviado) $index=0;$nombrearchivo.=$index.'.'.$aiext; $nombrearchivo = "$destino/$nombre".(++$index).'.'.$aiext; $nombre.=$index.'.'.$aiext; }else//utilizamos el nombre de archivo enviado xwShowError(ERROR_FILE_EXIST); return null; } //Si todo Ocurrió Correctamente subimos la imagen xwShowError(ERROR_FAIL_UPLOAD); return null; } }else{ xwShowError(ERROR_FILE_NOTFOUND); return null; } return $nombre; }
donde xwShowError es una función que imprime el error nada más... y $campo es el campo del formulario donde se ingresa el nombre del archivo... S2
|
|
« Última modificación: 7 Enero 2009, 06:05 am por Karman »
|
En línea
|
|
|
|
SaXo
Desconectado
Mensajes: 166
|
Hola, La función usa la estructura $_FILES por lo que se presume que esa función solo va a funcionar si los datos del fichero vienen de un formulario con un campo de tipo file. Por motivos de seguridad los formularios solo envían el nombre del fichero. Actualmente la función file() de php soporta varios tipos de protocolos, como por ejemplo http por lo que es igual de válido realizar estas dos formas para leer un fichero. file ('/files/ejemplo.gif'); file (' http://host/files/ejemplo.gif');Lo que hay que hacer es lo mismo que cuando hacemos un stream para descargar ficheros. Leer el fichero y escribirlo en nuestra ubicación. $archivo = " http://es.php.net/images/php_snow_2008.gif";$recurso = @fopen($archivo, "r"); if ($recurso) { while (!feof($recurso)) { $lines[] = fgets($handle, 4096); } fclose($handle); } $d = file('destino','w'); foreach ($lines as $key => $line){ fwrite($d,$line); } fclose($recurso); fclose($d); No he probado el código por lo que es probable que no funcione. Pero a modo de ejemplo vale para hacerse una idea de como hacer un stream para obtener ficheros de webs y guardarlos localmente.
|
|
|
En línea
|
|
|
|
eLank0
eLhAcKeR r00Lz
Desconectado
Mensajes: 1.062
|
La esquema de SaXo está bien, sólo hay que usar las funciones pertinentes.
S2
|
|
|
En línea
|
|
|
|
|
|