2010-12-28 6 views
2

Ich steckte mitten in dieser Situation, bitte helfen Sie mir aus.Senden der Dateien (mindestens 11 Dateien) von Ordner über Web-Service zu Android-App

Meine Frage ist, dass ich Dateien (insgesamt 11 PDF-Dateien) an Android-App mit Web-Service senden möchte.

Ich habe es mit unten Code versucht. Hauptklasse, von dem Web-Service erstellt wird

public class MultipleFilesImpl implements MultipleFiles { 

public FileData[] sendPDFs() { 
    FileData fileData = null; 
    // List<FileData> filesDetails = new ArrayList<FileData>(); 
    File fileFolder = new File(
      "C:/eclipse/workspace/AIPWebService/src/pdfs/"); 
    // File fileTwo = new File(
    // "C:/eclipse/workspace/AIPWebService/src/simple.pdf"); 

    File sendFiles[] = fileFolder.listFiles(); 
    // sendFiles[0] = fileOne; 
    // sendFiles[1] = fileTwo; 

    DataHandler handler = null; 
    char[] readLine = null; 
    byte[] data = null; 
    int offset = 0; 
    int numRead = 0; 
    InputStream stream = null; 
    FileOutputStream outputStream = null; 
    FileData[] filesData = null; 
    try { 
     System.out.println("Web Service Called Successfully"); 

     for (int i = 0; i < sendFiles.length; i++) { 
      handler = new DataHandler(new FileDataSource(sendFiles[i])); 
      fileData = new FileData(); 
      data = new byte[(int) sendFiles[i].length()]; 
      stream = handler.getInputStream(); 
      while (offset < data.length 
        && (numRead = stream.read(data, offset, data.length 
          - offset)) >= 0) { 
       offset += numRead; 
      } 
      readLine = Base64Coder.encode(data); 
      offset = 0; 
      numRead = 0; 
      System.out.println("'Reading File............................"); 
      System.out.println("\n"); 
      System.out.println(readLine); 
      System.out.println("Data Reading Successful"); 

      fileData.setFileName(sendFiles[i].getName()); 
      fileData.setFileData(String.valueOf(readLine)); 

      readLine = null; 
      System.out.println("Data from bean " + fileData.getFileData()); 

      outputStream = new FileOutputStream("D:/" 
        + sendFiles[i].getName()); 

      outputStream.write(Base64Coder.decode(fileData.getFileData())); 

      outputStream.flush(); 
      outputStream.close(); 
      stream.close(); 
      // FileData fileDetails = new FileData(); 
      // fileDetails = fileData; 
      // filesDetails.add(fileData); 
      filesData = new FileData[(int) sendFiles[i].length()]; 
     } 
     // return fileData; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return filesData; 
} 

}

auch die Schnittstelle MultipleFiles: -

public interface MultipleFiles extends Remote { 
    public FileData[] sendPDFs() throws FileNotFoundException, IOException, 
      Exception; 
} 

Hier habe ich eine Array von Bean "File Data" schicke, Eigenschaften haben FileData & Dateiname. FileData- enthält Dateidaten in codiert. Dateiname - kodierter Dateiname.

The Bean: - (Filedata)

public class FileData { 
    private String fileName; 
    private String fileData; 

    public String getFileName() { 
     return fileName; 
    } 

    public void setFileName(String fileName) { 
     this.fileName = fileName; 
    } 

    public String getFileData() { 
     return fileData; 
    } 

    public void setFileData(String string) { 
     this.fileData = string; 
    } 

} 

Das Android DDMS gibt Ausnahme von Speicher, wenn & unten Code versucht, als ich versuchte, dann die erste Datei erstellt wird nur zwei Dateien zu senden.

public class PDFActivity extends Activity { 
    private final String METHOD_NAME = "sendPDFs"; 
    private final String NAMESPACE = "http://webservice.uks.com/"; 
    private final String SOAP_ACTION = NAMESPACE + METHOD_NAME; 
    private final String URL = "http://192.168.1.123:8080/AIPWebService/services/MultipleFilesImpl"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     TextView textViewOne = (TextView) findViewById(R.id.textViewOne); 

     try { 
      SoapObject soapObject = new SoapObject(NAMESPACE, METHOD_NAME); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11); 
      envelope.setOutputSoapObject(soapObject); 

      textViewOne.setText("Web Service Started"); 
      AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL); 

      httpTransport.call(SOAP_ACTION, envelope); 

      // SoapObject result = (SoapObject) envelope.getResponse(); 
      Object result = envelope.getResponse(); 
      Log.i("Result", result.toString()); 
      // String fileName = result.getProperty("fileName").toString(); 
      // String fileData = result.getProperty("fileData").toString(); 

      // Log.i("File Name", fileName); 
      // Log.i("File Data", fileData); 

      // File pdfFile = new File(fileName); 


      // FileOutputStream outputStream = 
      // openFileOutput(pdfFile.toString(), 
      // MODE_PRIVATE); 

      // outputStream.write(Base64Coder.decode(fileData)); 
      Log.i("File", "File Created"); 
      // textViewTwo.setText(result); 
      // Object result = envelope.getResponse(); 
      // FileOutputStream outputStream = openFileOutput(name, mode) 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Bitte helfen Sie mit einigen Erklärungen oder Änderungen in meinem Code. Vielen Dank im Voraus.

Antwort

4

Ich selbst habe die Lösung dieser Frage.

Das Hauptproblem mir kSoap2 api 2.4 Version konfrontiert ist, dass ich nicht in der Lage komplexes Objekt (Array von Bohne in meinem Fall)

Dann änderte ich meinen Code aus diesem (mit ver 2.4) zu erhalten: -

try { 
      SoapObject soapObject = new SoapObject(NAMESPACE, METHOD_NAME); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11); 
      envelope.setOutputSoapObject(soapObject); 

      textViewOne.setText("Web Service Started"); 
      AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL); 

      httpTransport.call(SOAP_ACTION, envelope); 

      // SoapObject result = (SoapObject) envelope.getResponse(); 
      Object result = envelope.getResponse(); 
      Log.i("Result", result.toString()); 
      // String fileName = result.getProperty("fileName").toString(); 
      // String fileData = result.getProperty("fileData").toString(); 

      // Log.i("File Name", fileName); 
      // Log.i("File Data", fileData); 

      // File pdfFile = new File(fileName); 


      // FileOutputStream outputStream = 
      // openFileOutput(pdfFile.toString(), 
      // MODE_PRIVATE); 

      // outputStream.write(Base64Coder.decode(fileData)); 
      Log.i("File", "File Created"); 
      // textViewTwo.setText(result); 
      // Object result = envelope.getResponse(); 
      // FileOutputStream outputStream = openFileOutput(name, mode) 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

zu diesem Code (mit ver 2.5.1): -

try { 
     SoapObject soapObject = new SoapObject(NAMESPACE, METHOD_NAME); 

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
       SoapEnvelope.VER11); 

     envelope.setOutputSoapObject(soapObject); 

     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
     androidHttpTransport.call(SOAP_ACTION, envelope); 

     SoapObject result = (SoapObject) envelope.bodyIn; 

     for (int i = 0; i < result.getPropertyCount(); i++) { 
      SoapObject object = (SoapObject) result.getProperty(i); 

      Log.i("File Data", object.getProperty("fileData").toString()); 
      Log.i("File Name", object.getProperty("fileName").toString()); 

      pdfFiles = new File(object.getProperty("fileName").toString()); 
      outputStream = openFileOutput(pdfFiles.toString(), MODE_PRIVATE); 
      outputStream.write(Base64Coder.decode(object.getProperty(
        "fileData").toString())); 
     } 

     outputStream.flush(); 
     outputStream.close(); 
     Log.d("File Creation Message", "Files Created Succesfully"); 
    } catch (SoapFault fault) { 
     fault.printStackTrace(); 
    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (outputStream != null) { 
      outputStream = null; 
     } 
    } 

Daher bekam ich Lösung.

Die Haupthilfe ist durch die Ausgabe-24 davon: - Bitte lesen Sie, dass, wenn Sie mit einem solchen Problem konfrontiert sind. Link-Issue-24

Verwandte Themen