Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Problema salvataggio file su DB

    Salve a tutti
    Devo creare un'applicazione client-server in cui il client invia un file e il server lo riceve e lo salva su un database MySQL. Il file viene ricevuto, ma l'applicazione si blocca quando deve salvare il contenuto nel db e non riesco a capire perchè.

    Parte Client
    codice:
    import java.io.*;
    import java.net.*;
    import javax.swing.*;
    
    public class Upload{
    	public static void main(String[] args){
    		try{
    			Socket sDati= new Socket("LocalHost",12345);
    			String linea;
    			BufferedReader inp=new BufferedReader(new InputStreamReader(sDati.getInputStream()));
    			DataOutputStream outS= new DataOutputStream(sDati.getOutputStream());
    			JFileChooser scegliFile=new JFileChooser();
    
    			scegliFile.showOpenDialog(null);
    			File fileUp=scegliFile.getSelectedFile();
    			outS.writeBytes("Pippo\n");
    
    			outS.writeBytes(fileUp.getName()+"\n");
    			outS.writeLong(fileUp.length());
    
    
    			while((linea=inp.readLine())!=null){
    				outS.writeBytes(linea+"\n");
    			}
    			outS.close();
    
    			System.out.println("finito");
    		}
    		catch(Exception e){
    			System.out.println("Err "+e.getMessage());
    		}
    	}
    
    
    }
    Parte Server
    codice:
    import java.io.*;		//per aprire gli stream
    import java.net.*;		//per creare i socket
    import java.util.*;		//per StringTokenizer
    import java.sql.*;		//per interagire con il db
    import javax.swing.*;	//per JOptionPane
    
    public class Receive{
    
    	public static void main(String[] args) throws Exception{
    		try{
    
    			Connection c = null;
    			Statement st = null;
    
    			try{
    				//scelta del driver
    				Class.forName("com.mysql.jdbc.Driver").newInstance();
    
    				try{
    					//connessione al db
    					c = DriverManager.getConnection("jdbc:mysql://localhost:3306/progetto?","root","");
    					st = c.createStatement();
    					ServerSocket sClient= new ServerSocket(12345);
    
    					for(int i=1;;i++){
    						Socket sDati= sClient.accept();
    						System.out.println("client "+i+"...");
    
    						BufferedReader in=new BufferedReader(new InputStreamReader(sDati.getInputStream()));
    
    						DataInputStream input= new DataInputStream(sDati.getInputStream());
    						String user=in.readLine();
    						String fileName=in.readLine();
    						long fileLength=input.readLong();
    
    
    						PreparedStatement pstmt = c.prepareStatement("INSERT INTO files (nome_utente, contenuto) "+"VALUES (?, ?)");
    
    						pstmt.setString(1, user);
    
    						pstmt.setBinaryStream (2, sDati.getInputStream(), (int)fileLength);
    
    						pstmt.executeUpdate();
    						in.close();
    
    						pstmt.close();
    
    					}
    				}
    				catch(SQLException e){
    					System.out.println("Errore di connessione al database");
    				}
    			}
    			catch(Exception e){
    				System.out.println("Err "+e.getMessage());
    			}
    		}
    		catch(Exception e){
    			System.out.println("Err "+e.getMessage());
    		}
    	}
    }
    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema salvataggio file su DB

    Originariamente inviato da Insanity
    ma l'applicazione si blocca quando deve salvare il contenuto nel db e non riesco a capire perchè.
    Perché l'approccio nel gestire il "protocollo" di comunicazione è parecchio sbagliato!!

    Innanzitutto non ha molto senso che leggi il file "a righe" (anche se tu sapessi a priori che è un file di testo). Primo perché ci sono le solite questioni sul charset. Sai in quale charset è scritto il file di testo?? Perché così come lo leggi il InputStreamReader presuppone il charset di "default" della piattaforma. E se non è lo stesso usato dal file ..... ciccia (ovvero possono saltare fuori casini, caratteri interpretati male o peggio).

    Secondo, anche ammesso di costruire il InputStreamReader specificando il "giusto" charset per il file, devi comunque fare del lavoro in più tu. E se leggi "a righe" devi poi appendere tu il newline. Tu aggiungi "\n" ma .... se nel file avevi newline stile DOS CR+LF??? Te li perdi!!! E il length del file che invii comunque non è più congruente con lo stream di dati effettivo che mandi!!! (primo per il fatto che invii caratteri "troncati" e secondo, potenzialmente, per questioni di charset).

    E poi scrivi la linea con writeBytes() del DataOutputStream. Già ... peccato che questo metodo "tronca" il carattere e scrive solo il byte "basso" del char (che invece è a 16 bit). Tutto lavoro sprecato l'uso del BufferedReader e InputStreamReader!!!

    E comunque sappi che è sbagliato usare un InputStream da più wrapper differenti. Nel server l'InputStream lo usa il BufferedReader ma anche il DataInputStream. Non puoi leggere "correttamente" un po' da uno e un po' dall'altro!!!

    Non mi dilungo troppo (ci sarebbe altro ... ma meglio terminare qui).
    No, mi spiace rivedi tutto. Sì ... hai capito: rivedi molto bene tutto quanto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ok, grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.