import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import com.oreilly.servlet.MultipartRequest;
/**
 * Eksempel på opplasting/nedlasting av filer for lagring i BLOB i MySQL database
 * Tabell som benyttes er TESTBLOB
 * For nedlasting av filer må parameteren id angis med idnr. for obkjekt som skal lastes ned
 *  #
    # Table structure for table 'testblob'
    #

      CREATE TABLE testblob (
        id int(11) NOT NULL auto_increment,
        kode blob,
        mimetype varchar(50),
        filename varchar(50) NOT NULL,
        filesize varchar(16),
        PRIMARY KEY (id)
      );

   BLOB kan lagre maksimal filstørrelse på (2^16 -1) biter, dvs. maksimal filstørrelse er 65Kbytes
   Benytt LONGBLOB (2^32 biter) for lagring av større filer.
 */
public class testblob1 extends HttpServlet {

  String brukernavn = null;
  String passord = null;
  String url = null;
  String objektsform = "";

  // Bruker init funksjonen for å forsøke å initialisere databasedriveren
  public void init (ServletConfig config) throws ServletException {
    super.init (config);
    try {
        Class.forName("org.gjt.mm.mysql.Driver");
    } catch (Exception e) {
      throw new UnavailableException (this, "Fant ingen databasedriver");
    }
    brukernavn = "user";
    passord = "passwd";
    url = "jdbc:mysql://limbo.hin.no:3306/test";
      try {
         BufferedReader br = new BufferedReader (new FileReader ("k:\\studwww\\servlets\\bildetildb.html"));
         StringBuffer sb = new StringBuffer ();
         String tmp;
         while ((tmp = br.readLine())!=null)
            sb.append (tmp+"\n");
         objektsform = sb.toString ();
         br.close ();
      } catch (IOException ioe) {
         throw new UnavailableException (this, "Kunne ikke kjøre template filen");
      }
  }

  protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

    ServletOutputStream ut = res.getOutputStream();
    java.io.InputStream in;
    try {
      // Kobler oss opp mot databasen
      Connection forbindelse = DriverManager.getConnection(url, brukernavn, passord);
      Statement uttrykk = forbindelse.createStatement ();
      String id = req.getParameter("id");
      if (id == null) {
        res.setContentType("text/html");
        res.setHeader("pragma", "no-cache");
        ut.println (objektsform);
        ut.close();
      }
      else {
        ResultSet result = uttrykk.executeQuery ("Select kode, mimetype, filename from testblob where id="+id);
        if (result.next())
        {
          res.setContentType (result.getString(2)); // mimetype
          res.addHeader("Content-Disposition", "filename=" + result.getString(3));  // filename
          drawBlob(result.getBlob(1), ut);
        }
        result.close ();
        forbindelse.close ();
      }
    } catch (SQLException sqle) {
      sqle.printStackTrace();
    }
  }

  public void doPost( HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

    // Oppretter et multipart request objekt som brukes for å laste ned filer
    // e:\studwww\servlets\filer er den katalogen jeg ønsker at
    // filene skal legges i
    // Denne katalogen må apache webtjener ha skriverettigheter til
    // Setter også maks størrelse på filer som kan lastes opp, 16MB

    MultipartRequest multi = new MultipartRequest (req, "k:\\studwww\\servlets\\filer\\", 16777216);
    res.setContentType("text/html");
    res.setHeader("pragma", "no-cache");
    PrintWriter ut = res.getWriter();
    ut.println ("<html><body>");
    try {
      Enumeration files = multi.getFileNames();
      while (files.hasMoreElements()) {
        String filetype = multi.getContentType(files.nextElement().toString());

        // getFile funksjonen returnerer et File objekt som inneholder all informasjonen om
        // filen som brukeren har sendt

        File f = multi.getFile("objekt");

        // getName i fra File objektet gir navnet på filen

        String filename = f.getName();
        ut.println ("Navn på fil fra filobjektet : " + filename + "<BR>");
        //henter ut filtype finner det i objektet vha getName

        ut.println ("Filtype: " + filetype  + "<BR>");

        //henter ut filstørrelsen, finner det i objektet

        String filesize = new Long(f.length()).toString();
        ut.println ("Filstørrelse: " + filesize + "<BR>");

        // getParameter henter på vanlig måte innholdet i en parameter, dette fra et tekst felt i formen

        loadSamples( filetype, filename, 0, f,  filesize );
      } // while
    } catch (Exception e) {
      ut.println ("Feil : "+e);
      return;
    }
      ut.println ("Informasjonen er lagret");
      ut.println ("</body></html>");

      ut.close ();
  }

  /**
  * Retrieve the Blob data from input Blob column into a local file,
  * and draws the image
  **/
  void drawBlob(Blob p_blob, ServletOutputStream l_fileOutStream) {

    try {
      // Open a stream to read the Blob data
      InputStream l_blobStream = p_blob.getBinaryStream();

      // Open a file stream to save the Blob data
//      FileOutputStream l_fileOutStream = new FileOutputStream(p_airPCode+".gif");

      // Read from the Blob data input stream, and write to the file output
      // stream
      byte[] l_buffer = new byte[10]; // buffer holding bytes to be transferred
      int l_nbytes = 0;  // Number of bytes read
      while ((l_nbytes = l_blobStream.read(l_buffer)) != -1) // Read from Blob stream
        l_fileOutStream.write(l_buffer,0,l_nbytes); // Write to file stream

      // Flush and close the streams
      l_fileOutStream.flush();
      l_fileOutStream.close();
      l_blobStream.close();

    } catch (Exception ex) { // Trap SQL and IO errors
    }
  }

  /**
  * Creates a new row in table TESTBLOB using JDBC2.0.
  **/
  void loadSamples(String mimetype, String filename, int id, File  fImage, String filesize) {

    try {

      Connection forbindelse = DriverManager.getConnection(url, brukernavn, passord);
      PreparedStatement l_pstmt=forbindelse.prepareStatement(
            "insert into testblob (id, kode, mimetype, filename, filesize"+
            ") values(? , ?, ?, ?, ? )");

      l_pstmt.setInt(1,id);             // id
      l_pstmt.setString(3,mimetype);  // mimetype
      l_pstmt.setString(4,filename);  // filename
      l_pstmt.setString(5,filesize);  // filesize

      InputStream isImage = new FileInputStream( fImage );
      l_pstmt.setBinaryStream( 2,
           isImage, (int)( fImage.length() ) );
      l_pstmt.execute();               // Execute SQL statement

      l_pstmt.close();    // Close statement

    } catch (Exception ex) { // Trap SQL errors

    }
  }



}