2017-09-27 4 views
0

Ich habe eine Anforderung zum Senden von docx/pdf-Dateien als E-Mail. So sende ich Datei als Binär-String von Ajax zu Java Servlet & konvertiert es zu InputStream & dann übergeben Sie es als ByteArray zu ByteArrayDataSource. Ich bekomme E-Mail mit Anhang, aber die PDF-Datei ist leer. Unten ist der Code: -Convert BinaryString zu ByteArray - Java

Ajax:

var reader = new FileReader(); 
      reader.onload = function() { 
       $.ajax({ 
        url: 'SendAttachments', 
        type: 'POST', 
        data: jQuery.param({positionApllied:"tester", 
         Name:"John", 
         fileName:"invoice.pdf", 
         fileType:"application/pdf", 
         attachment:reader.result}), 
        success: function(data, textStatus, jqXHR) 
        {}, 
        error: function(jqXHR, textStatus, errorThrown) 
        {} 
       }) 
      } 
      reader.readAsBinaryString(file) 

Java Servlet:

String filecontent = request.getParameter("attachment"); 
    InputStream stream = new ByteArrayInputStream(filecontent.getBytes("UTF-8")); 

    byte[] bucket = new byte[32*1024]; 
    ByteArrayOutputStream result = null; 
    try { 
     try { 
     result = new ByteArrayOutputStream(bucket.length); 
     int bytesRead = 0; 
     while(bytesRead != -1){ 
      bytesRead = stream.read(bucket); 
      if(bytesRead > 0){ 
      result.write(bucket, 0, bytesRead); 
      } 
     } 
     } 
     finally { 
      stream.close(); 
     } 
    } 
    catch (IOException ex){ 
    } 


    ByteArrayDataSource source = new ByteArrayDataSource(result.toByteArray(), fileMime); 

Antwort

0

ich die Lösung gefunden zu haben. Verwenden Sie reader.readAsDataURL (Datei) statt reader.readAsBinaryString (file). Und übergeben Sie den Parameter als

data: jQuery.param({positionApllied:applied, 
         cName:cname, 
         fileName:fname, 
         fileType:ftype, 
         attachment:reader.result.split(",")[1]}), 

Und in Java, dekodieren Sie die Zeichenfolge.

String filecontent = request.getParameter("attachment"); 

    byte[] decodedBytes = Base64.decode(filecontent); 

    InputStream stream = new ByteArrayInputStream(decodedBytes); 

    byte[] bucket = new byte[32*1024]; 
    ByteArrayOutputStream result = null; 
    try { 
     try { 
     result = new ByteArrayOutputStream(bucket.length); 
     int bytesRead = 0; 
     while(bytesRead != -1){ 
      bytesRead = stream.read(bucket); 
      if(bytesRead > 0){ 
      result.write(bucket, 0, bytesRead); 
      } 
     } 
     } 
     finally { 
      stream.close(); 
     } 
    } 
    catch (IOException ex){ 
    } 

    ByteArrayDataSource source = new ByteArrayDataSource(result.toByteArray(), fileMime);