2016-05-04 9 views
0

Ich möchte den Upload von Dateien in PostgreSQL implementieren. Ich habe versucht, diese Lösung:InputStream in PostgreSQL einfügen

public static byte[] getBytesFromInputStream(InputStream is) throws IOException 
    { 
     try (ByteArrayOutputStream os = new ByteArrayOutputStream();) 
     { 
      byte[] buffer = new byte[0xFFFF]; 

      for (int len; (len = is.read(buffer)) != -1;) 
       os.write(buffer, 0, len); 

      os.flush(); 

      return os.toByteArray(); 
     } 
    } 

    public void upload() throws SQLException 
    { 
     if (file != null) 
     { 
      try 
      { 
       InputStream inputStream = file.getInputStream(); 

       byte[] bytesFromInputStream = getBytesFromInputStream(inputStream); 
       ByteArrayInputStream input = new ByteArrayInputStream(bytesFromInputStream); 


       long lastTimestamp = System.currentTimeMillis(); 
       int pushInterval = 1000; 
       long totalRead = 0; 
       long size = file.getSize(); 

       int bytesRead = 0; 
       final byte[] chunck = new byte[1024]; 
       while ((bytesRead = inputStream.read(chunck)) != -1) 
       { 
//     outputStream.write(chunck, 0, bytesRead); 
        totalRead += bytesRead; 

        if (System.currentTimeMillis() > lastTimestamp + pushInterval) 
        { 
         lastTimestamp = System.currentTimeMillis(); 
         uploadProgress.send(100.0 * totalRead/size); // Make sure this isn't sent more often than once per second. 
        } 
       } 

       Connection conn = ds.getConnection(); 
       // insert into database file 
       PreparedStatement ps = null; 
       boolean committed = false; 
       try 
       { 
        conn.setAutoCommit(false); 

        ps = conn.prepareStatement("INSERT INTO PROCEDURE_FILES (ID, PROCEDURE_ID, FILE_NAME, FILE) " 
         + " VALUES (?, ?, ?, ?)"); 
        ps.setInt(1, obj.number); 
        ps.setInt(2, obj.number); 
        ps.setString(3, file.getSubmittedFileName()); 
        ps.setBinaryStream(4, input, input.available()); 

        ps.executeUpdate(); 
        ps.close(); 

        conn.commit(); 
        committed = true; 
       } 
       catch (SQLException e) 
       { 
        e.printStackTrace(); 
       } 
       finally 
       {} 
      } 
      catch (IOException e) 
      {} 
     } 
    } 

aber ich bekomme diese Fehlermeldung:

org.postgresql.util.PSQLException: ERROR: column "file" is of type oid but expression is of type bytea 
Hint: You will need to rewrite or cast the expression. 

Wie ich dieses Problem lösen kann?

+0

können Sie sich diesen Link anschauen - https://virgo47.wordpress.com/2008/06/13/jpa-postgresql-and-bytea-vs-oid-type/ – Gandhi

+0

Ich benutze JPA nicht. –

Antwort

1

Sie müssen Ihren InputStream in ein Oid-Objekt umwandeln, bevor Sie fortfahren. Um dies zu tun, erstellen Sie einfach eine neue Oid das Byte-Array übergeben Sie aus dem IS erhalten:

Oid oid = new Oid(IOUtils.readFully(inputStream, -1, false)); 

dann werden Sie die oid in der vorbereiteten Anweisung übergeben.

Eine andere Lösung, datenbankseitig, würde die Spalte der Tabelle in einen BLOB-Typ ändern.

+0

Wahrscheinlich meinst du, dass ich 'inputStream' werfen muss? –

+0

Ja, ich missverstanden Entschuldigung. – Aurasphere

+0

Eine allgemeine Frage. Was passiert, wenn ich eine 2-GB-Datei auf einen Server mit 1 GB RAM hochlade? –