Autor
|
Tema: Problema enviar archivo (Leído 11,220 veces)
|
~~
|
Podias ponerlo, a mi me interesa saber como leer un archivo de 2GB por ej y q el VB no se pete, como lo haces tu?
Justamente esa es la idea mala que tenemos hasta ahora de transferir el archivo, es decir pasar tooooodo el archivo a una variable y despues transferirlo, y claro viene las imaginaciones malevolas por cierto de decir como paso 80GB a una variable sin que el basic se cuelgue, pues no necesariamente debes pasar lo 80GB del archivo a una variable... y este es el secreto... el tamaño archivo se debe dividir en partes (en cuantas sea necesario) y extraer solo esos tamaños o poriones a una variable lo que es mas razonable que pasar todo el archivo a una variable para luego transferirlos, puedes dividirlo en 10, 100, 1000, o 5000 partes y cada pedazo transferirlo sin problemas. Yo un archivo de mas de 100MB lo divido en 4096 partes aunque puedo elegir ese valor.... esto es 104857600 / 4096 = 25600bytes osea casi 25KB, esos 25 kb a una variable y esa variable se procede a transferir hasta terminar... si sobra bytes tambien eso se controla, este es el secreto que uso, asi que por teoria ningun archivo asi sea este de 100TB no deberia colgar al basic, aunque quien sabe. Un Saludo. Si la historia es esa. Yo cuando subo archivos los suele subir de 10 en 10 bits para poner la barra de progreso, pero primero lo leo entero La cuestion es, al abrir desde VB (open "C:\...) un archivo de 80GB (simplemente usar la orden open) no se te revienta el programa??
|
|
|
En línea
|
|
|
|
yovaninu
Desconectado
Mensajes: 349
|
|
|
|
En línea
|
|
|
|
~~
|
Pero nos vas a decir como leerlo sin q reviente o no?
|
|
|
En línea
|
|
|
|
vivachapas
Desconectado
Mensajes: 612
|
como hacen para pasar de a 10 bites... o mas o menos.. yo simplemente pongo ws.senddata file... y lo envia como puede.. o como este por defecto... y como ponen un archivo en varias string... ¿?
|
|
|
En línea
|
|
|
|
~~
|
Al obtener el archivo entero piensa q es una cadena xD por lo q puedes trabajar con el como tal: For o = 1 To Len(Todo) 'Leemos el archivo de 10 en 10 bit's Parte = Mid(Todo, o, 10) o = o + 9 ws.SendData Parte 'Enviamos los 10 bit's Next o todo es el archivo entero
|
|
|
En línea
|
|
|
|
vivachapas
Desconectado
Mensajes: 612
|
bien.. creo q lo entendi mas o menos... Parte = Mid(Todo, o, 10) el 10 es de 10 bites... osea q si quiero pasar de a 5 por ejemplo pongo 5 ¿? y a este no lo entendi... o = o + 9 no tendria q ser mas 10¿?
|
|
|
En línea
|
|
|
|
~~
|
No pruevalo y veras como tiene q ser 9, si pones 10 pierdes datos. Tambien puedes usar step: For o = 1 To Len(Todo) step 10 Parte = Mid(Todo, o, 10) ws.SendData Parte 'Enviamos los 10 bit's Next o 1S4ludo
|
|
|
En línea
|
|
|
|
ZoNike
Desconectado
Mensajes: 13
|
tengo un problemilla con el codigo.. porfa aber si alguien me puede ayudar.. gracias. SERVIDOR: Private Sub Winsock_DataArrival(ByVal bytesTotal As Long) Dim datosS As String Winsock1.GetData datosS
If Left(datosS, 7) = "archivo" Then dato = Split(datosSS, "|") 'una variable dato (dim dato() as string) se encarga de dividir clave, tamaño y ruta filesize = dato(1) 'aqui tengo el tamaño enviado por el cliente Winsock1.SendData "enviar" 'ahora si le pido al cliente que envie el archivo en si datosSS = "" End If End Sub
Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long) Dim Datos2 As String Dim datos As String Winsock2.GetData datos
Datos2 = Datos2 & datos 'lo que te decia: juntamos parte por parte el archivo que el cliente esta enviando
If Len(Datos2) = filesize Then 'si termina Open App.Path & "nuevoArchivo.jpg" For Binary As #4 'asumo que envias un JPG, sino vas a tener que usar un CommonDialog en el cliente si quieres usar el mismo nombre de archivo que envias del cliente Put #4, 1, Datos2 Close #4 Datos2 = "" 'vaceas el buffer MsgBox "Archivo Recibido con Éxito." 'vuala, aqui termina todo el proceso y depues de esto supongo que tendras que cargar la imagen recibida a un picture, eso ya es tu trabajo. End If End Sub CLIENTE: Private Sub Timer2_Timer()
SavePicture Picture1.Image, App.Path + "/temp.bmp"
Open App.Path + "/temp.bmp" For Binary As #1 filedata = Input(LOF(1), 1) 'en esta variable string cargo todo el archivo Close #1
filesize = Len(filedata) 'aqui calculo el tamaño de lo que estoy enviando (long) en bytes
If Winsock1.State = "7" Then Winsock1.SendData "enviar" & "|" & filesize 'envio prmeramente una clave "enviar" luego el tamaño "filesize" y la ruta "ruta"... (aun no estoy enviando el archivo en si) End If End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim data As String Winsock1.GetData data If data = "enviar" Then Winsock2.SendData filedata End If End Sub Aqui como lo he puesto esta para que funcione con 2 Winsock pero si me lo podeis explicar con 1 solo muxo mejor, gracias x todo espero respuesta. saludos.
|
|
|
En línea
|
|
|
|
vivachapas
Desconectado
Mensajes: 612
|
pero q problema tienes?? lo quieres hacer con un solo winsock? q es lo q no entiendes... o yo no te entiendo...
|
|
|
En línea
|
|
|
|
ZoNike
Desconectado
Mensajes: 13
|
Pues que el codigo en si no me funciona... no recibe nada.
|
|
|
En línea
|
|
|
|
|
|