Traté de crear el archivo en el servidor utilizando el flujo de entrada que estoy recibiendo de parte del cliente.
Archivo se crea con el mismo tamaño que el del archivo original. Pero cuando se trata de abrirlo está demostrando que el archivo está dañado.
fileSharing.jsp el servidor de cliente que está tratando de recurso compartido de archivos (remitente)
HttpURLConnection httpURLConnection = null;
OutputStream os = null;
InputStream is = null;
try {
File fileObj = new File("D://test.pdf");
out.print("File Length " + fileObj.length() + " Name " + fileObj.getName());
URL url = new URL("http://localhost:2080/Receiver/fileupload?filename=test.pdf&filelength=" + fileObj.length());
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setDoOutput(true);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Content-Type", "multipart/mixed");
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
httpURLConnection.setRequestProperty("Cache-Control", "no-cache");
httpURLConnection.setRequestProperty("Content-Disposition", "form-data; name=\"Dummy File Description\"");
httpURLConnection.setChunkedStreamingMode(8192);
httpURLConnection.connect();
is = new BufferedInputStream(new FileInputStream(fileObj));
os = new BufferedOutputStream(httpURLConnection.getOutputStream());
byte[] buff = new byte[8192];
int len = 0;
while ((len = is.read(buff, 0, buff.length)) > 0) {
os.write(buff, 0, len);
os.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
is.close();
os.close();
httpURLConnection.disconnect();
}
Servlet FileUploadController en el lado del servidor que está intentando descargar el archivo (receptor)
InputStream is = null;
OutputStream os = null;
try {
is = request.getInputStream();
int total = 0;
int bytes = 0;
os = new BufferedOutputStream(new FileOutputStream(new File("D://files//dummy.pdf")));
byte[] buff = new byte[8192];
while (true) {
if ((bytes = is.read(new byte[8192])) == -1) {
System.out.println("File shared successfully");
System.out.println("Total " + total);
break;
}
total = total + bytes;
System.out.println("Length " + bytes);
os.write(buff, 0, bytes);
//os.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
is.close();
os.close();
}
En el bucle de lectura FileUploadController
que una instancia de una nueva matriz y leer en ella, pero que no se aferra a él para continuar su uso:
byte[] buff = new byte[8192];
while(true){
if((bytes = is.read(new byte[8192])) == -1){
Sin embargo, se escribe buff
en el archivo (que estará lleno de 0 bytes, por lo que tendrá un archivo con la longitud correcta, pero está lleno de 0 en lugar de los datos reales).
Sustituir a la última línea con
if((bytes = is.read(buff)) == -1){