Java Encode file to Base64 string To match with other encoded string

92,822

Solution 1

You already using apache commons-codec so I recommend adding commons-io for reading the file. That way you can remove your loadFile() method and just have:

private static String encodeFileToBase64Binary(String fileName) throws IOException {
    File file = new File(fileName);
    byte[] encoded = Base64.encodeBase64(FileUtils.readFileToByteArray(file));
    return new String(encoded, StandardCharsets.US_ASCII);
}

Solution 2

Here is a solution without any required dependencies (Apacha et al.) requiring only JDK 8+:

import java.util.Base64;
import java.nio.file.Files;

private static String encodeFileToBase64(File file) {
    try {
        byte[] fileContent = Files.readAllBytes(file.toPath());
        return Base64.getEncoder().encodeToString(fileContent);
    } catch (IOException e) {
        throw new IllegalStateException("could not read file " + file, e);
    }
}

Solution 3

Since Java 8 you can use the class java.util.Base64 and the corresponding inner classes:

  • java.util.Base64.Encoder
  • java.util.Base64.Decoder

See JavaDoc: Base64-Doc

And a sample for the use: Example from Oracle

Solution 4

This example worked great for me: https://grokonez.com/java/java-advanced/java-8-encode-decode-an-image-base64

public static String encoder(String filePath) {
        String base64File = "";
        File file = new File(filePath);
        try (FileInputStream imageInFile = new FileInputStream(file)) {
            // Reading a file from file system
            byte fileData[] = new byte[(int) file.length()];
            imageInFile.read(fileData);
            base64File = Base64.getEncoder().encodeToString(fileData);
        } catch (FileNotFoundException e) {
            System.out.println("File not found" + e);
        } catch (IOException ioe) {
            System.out.println("Exception while reading the file " + ioe);
        }
        return base64File;
    }
Share:
92,822
Sanket Sawant
Author by

Sanket Sawant

Updated on November 18, 2020

Comments

  • Sanket Sawant
    Sanket Sawant over 3 years
    private static String encodeFileToBase64Binary(String fileName)
            throws IOException {
    
        File file = new File(fileName);
        byte[] bytes = loadFile(file);
        byte[] encoded = Base64.encodeBase64(bytes);
        String encodedString = new String(encoded,StandardCharsets.US_ASCII);
    
        return encodedString;
    }
    private static byte[] loadFile(File file) throws IOException {
        InputStream is = new FileInputStream(file);
    
        long length = file.length();
        if (length > Integer.MAX_VALUE) {
            // File is too large
        }
        byte[] bytes = new byte[(int)length];
    
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length
               && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
            offset += numRead;
        }
    
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file "+file.getName());
        }
    
        is.close();
        return bytes;
    }
    

    // to get encode string

    String encoded=encodeFileToBase64Binary("file.fmr");
    

    // encoded string is :

    Rk1SACAyMAAAAAFiAAABQAHgAMUAxQEAAABGNkDZADP/SEC8AD6CSECqAEcGSED+AFJtO0CgAGCKZEC6AGuFZEDgAHz1ZECzAI6HZEENAJluNEBWAJ4ZZEB1AKkTZEECALbuZEA/ALqfSECCALySSECxAMP/ZECIAMURVUAXAN2jGkCnAOD8ZEAoAOWlZEBnAOyhLkCyAP/tZECHAQMSGkD8AQTdZECfASKFGkCHASUaGkA1ASy6ZEDAAS3JZEDPAS7NZEAnATG4ZEDxATzOZEBOAUPLZEBzAVbuGkCAAWF8NEDTAWsxLkDnAXa0LkC/AX2nLkC0AYojIEBMAYvkSEDJAa0fT0CsAbwVIIDqANTsZIDIAPfnZICbAQKHO4D5AR/XZIBlASS7IIEoASbYO4CsAUetLoDvAVXSZIDaAVvDO4EHAWrLZICsAX2fNIDnAYEwNIDQAZKnT4BfAZxtZAAA
    

    //encoded string from file using some other source.

    Rk1SACAyMAAAAAFiAAABQAHgAMUAxQEAAABGNkCLACELSEDAADYDZEEYAGFxO0DGAGJ9SEC1AGkCSEA6AHWYVUDJAHp5ZEBEAHwVZECVAJgIZEEaALHrZEB4ALuOZEELAMFqZEEzAM/sNEDRANvwZEBkAN0VZECcAOIAZEEwAOjnLkEvAPXlO0CnAP71ZEB7AQYRNEBdAQ0eZED8ARDhZEDXASXcZECZAS3uGkBoAT4eO0AUAUMxSEA7AUYqZEDxAUnSZECmAVNDO0EIAXDHSEDYAXW7ZEEUAXXKSEEGAYY8IEEhAYrDNEDfAZ81ZEDQAcGqLoEBAC/7O4EGAE7zVYB+AP2QSICEARuLZIBnATUfO4D/ATXaZIDEATjSZIDRATrVZICnATvSNIBTATwnZIARAV1LGoB1AV2oO4CrAV68SIDnAWHGZIB+AWauNICVAX0ySICNAYytO4CJAZorSAAA
    

    When i am trying to match both the encoded string , i am getting a missmatch. please suggest method for encode file to base64 to match encoded string found from other source. i have tried with StandardCharsets.UTF_8 and StandardCharsets.US_ASCII.

  • Sanket Sawant
    Sanket Sawant almost 8 years
    Thank you for your response. but i am getting same result in encoding.
  • gfelisberto
    gfelisberto almost 8 years
    I tested this with several files and an external Base64 encoder. Can you provide an example file?
  • Lutaaya Huzaifah Idris
    Lutaaya Huzaifah Idris almost 7 years
    facing a problem , Base64.encodeBase64(); cannot be resolved why?
  • Cristian A. Rodríguez Enríquez
    Cristian A. Rodríguez Enríquez over 6 years
    @LutaayaHuzaifahIdris you need import org.apache.commons.codec.binary.Base64; in order to use Base64.encodeBase64() you get the JAR from commons.apache.org/proper/commons-codec