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

    Servlet che legge da blob Oracle e mostra file all'utente

    Salve a tutti,
    ho una servlet che servirebbe a leggere da un campo blob di un db oracle (su cui precedentemente viene salvato un file). Da questo blob viene estratto un InputStream e poi viene scritto sull'OutputStream della response http in modo da permettere al browser di scaricare il file.
    Però, non capisco perché il file che viene generato è vuoto.


    Un esempio di blob memorizzato a db è il seguente:

    2d2d2d205363726970742070657220637265617a696f6e6520 746162656c6c6120666973696361202d2d2d0d0a4352454154 45205441424c4520746573745f626c6f625f66696c650d0a28 0d0a0975706c6f61645f69640909494e54454745520909094e 4f54204e554c4c2c0d0a202020200966696c655f6e616d6509 0956415243484152322831323820425954452920202020094e 4f54204e554c4c2c0d0a20200966696c655f64617461090942 4c4f42202020202020202020202020202020094e4f54204e55 4c4c2c0d0a0d0a09434f4e53545241494e5420506b5f546573 745f426c6f625f46696c65205052494d415259204b45592028 75706c6f61645f6964290d0a29


    Questo è il codice della servlet:

    codice:
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //get upload id from URL's parameters
            int uploadId = Integer.parseInt(request.getParameter("id"));
             
            Connection conn = null; // connection to the database
             
            try {
                //connects to the database
                conn = OracleJDBCConn.creaConnessione();
     
                //queries the database
                String sql = "SELECT * FROM test_blob_file WHERE upload_id = ?";
                PreparedStatement statement = conn.prepareStatement(sql);
                statement.setInt(1, uploadId);
     
                ResultSet result = statement.executeQuery();
                if (result.next()) {
                    // gets file name and file blob data
                    String fileName 		= result.getString("file_name");
                    Blob blob 				= result.getBlob("file_data");
                    InputStream inputStream = blob.getBinaryStream();
                    int fileLength 			= inputStream.available();
                     
                    System.out.println("fileLength = " + fileLength);
     
                    ServletContext context = getServletContext();
     
                    // sets MIME type for the file download
                    String mimeType = context.getMimeType(fileName + ".txt");
                    if (mimeType == null) {        
                        mimeType = "application/octet-stream";
                    }              
                     
                    // set content properties and header attributes for the response
                    response.setContentType(mimeType);
                    response.setContentLength(fileLength);
                    String headerKey = "Content-Disposition";
                    String headerValue = String.format("attachment; filename=\"%s\"", fileName + ".txt");
                    response.setHeader(headerKey, headerValue);
     
                    // writes the file to the client
                    OutputStream outStream = response.getOutputStream();
                     
                    byte[] buffer 	= new byte[BUFFER_SIZE];
                    int bytesRead 	= -1;
                    int offset		= 0; 
                    
                    while ((bytesRead = inputStream.read(buffer)) != -1) {
                    	outStream.write(buffer, offset, bytesRead);
                    	//offset += BUFFER_SIZE;
                    }
                     
                    inputStream.close();
                    outStream.close();             
                } else {
                    // no file found
                    response.getWriter().print("File not found for the id: " + uploadId);  
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
                response.getWriter().print("SQL Error: " + ex.getMessage());
            } catch (IOException ex) {
                ex.printStackTrace();
                response.getWriter().print("IO Error: " + ex.getMessage());
            } finally {
                if (conn != null) {
                    // closes the database connection
                    try {
                        conn.close();
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                }          
            }
        }

    Qualche suggerimento ?

    Grazie dell'attenzione
    Non ci sono Queen senza Freddie !

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da music_ale Visualizza il messaggio
    Qualche suggerimento ?
    Non ho letto tutto tutto ... ma l'occhio mi è subito "caduto" su un punto:

    NON usare inputStream.available() (leggi cosa dice il javadoc di InputStream )

    Blob ha il long length()
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Si, ho utilizzato il length() e ora funziona, infatti passavo 0 al setContentLength della response...

    Grazie
    Non ci sono Queen senza Freddie !

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 © 2024 vBulletin Solutions, Inc. All rights reserved.