Отправка файлов (не менее 11 файлов) из папки через веб -службу в приложение Android
-
13-10-2019 - |
Вопрос
Я застрял в середине этой ситуации, пожалуйста, помогите мне.
У меня вопрос, что я хочу отправлять файлы (всего 11 файлов PDF) в приложение Android с помощью веб -службы.
Я попробовал это с кодом ниже.Основной класс, из которого создается веб -сервис
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;
}
}
Также интерфейс несколько файлов:-
public interface MultipleFiles extends Remote {
public FileData[] sendPDFs() throws FileNotFoundException, IOException,
Exception;
}
Здесь я посылаю массив бобов "файловые данные", имея свойства, а именно. Filedata & Filename. FileData- содержит данные файла в кодированных. FileName- кодированное имя файла.
Бин:- (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;
}
}
Android DDMS выдает исключение по памяти, когда пробовал ниже код, и когда я попытался отправить два файла, тогда создается только первый файл.
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();
}
}
}
Пожалуйста, помогите с некоторыми объяснениями или изменениями в моем коде. Заранее спасибо.
Решение
Я получил решение этого вопроса.
Основная проблема, с которой я столкнулся с использованием версии KSOAP2 API 2.4, заключается в том, что я не могу получить сложный объект (в моем случае массив бобов)
Затем я изменил свой код с этого (с помощью версии 2.4):-
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();
}
к этому коду (с использованием версии 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;
}
}
Следовательно, я получил решение.
Основная помощь- через проблему-24 этого:- Пожалуйста, прочитайте, что если вы столкнетесь с такой проблемой.Link-Issue-24