Drowning a file from server to client with servlet

I am trying to write a servlet that can upload a file from a client to a server and upload a file from a server to a client from a specific location to a specific location. But two problems stopped me: 1. When downloading a file from the client to the server, how can I tell the server where to store the file? 2. (and, more importantly) How to download from the server to the client part?

Here is the code:

import java.io.FileOutputStream;  
import java.io.ObjectInputStream;  
import java.io.ObjectOutputStream;  
import java.net.ServerSocket;  
import java.net.Socket;  

 public class Server extends Thread {  
   public static final int PORT = 3333;  
   public static final int BUFFER_SIZE = 100;  

 @Override  
 public void run() {  
     try {  
         ServerSocket serverSocket = new ServerSocket(PORT);  
         while (true) {  
             Socket s = serverSocket.accept();  
             saveFile(s);  
         }  
     } catch (Exception e) {  
         e.printStackTrace();  
     }  
 }  

 private void saveFile(Socket socket) throws Exception {  
     ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());  
     ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());  
     FileOutputStream fos = null;  
     byte [] buffer = new byte[BUFFER_SIZE];    
     Object o = ois.readObject();  

     if (o instanceof String) {  
         fos = new FileOutputStream(o.toString());  
     } else {  
         throwException(null);  
     }  
     Integer bytesRead = 0;  

     do {  
         o = ois.readObject();  

         if (!(o instanceof Integer)) {  
             throwException(null);  
         }  

         bytesRead = (Integer)o;  

         o = ois.readObject();  

         if (!(o instanceof byte[])) {  
             throwException(null);  
         }  

         buffer = (byte[]) o;   
         fos.write(buffer, 0, bytesRead);  
     } while (bytesRead == BUFFER_SIZE);  

     fos.close();  

     ois.close();  
     oos.close();  
 }  

 public static void throwException(String message) throws Exception {  
     throw new Exception(message);  
 }  

 public static void main(String[] args) {  
     new Server().start();  
 }  

}

package com.filetransfer.web;
import java.io.*;
import java.net.Socket;
import java.util.Arrays;
import javax.servlet.*;
import javax.servlet.http.*;

public class FileTransfer extends HttpServlet {

private static final long serialVersionUID = 1L;
public static final int PORT = 3333;  
public static final int BUFFER_SIZE = 100; 
public static final String HOST = "localhost";

public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    String action = request.getParameter("option");
    System.out.println(action);
    if ("upload".equals(action)) {
        uploadFile(request);
    } else if ("download".equals(action)) {
        downloadFile(request, response);
    }
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    doGet(request, response);
}
public void reportError(HttpServletResponse response, String message) throws IOException {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
}

public void uploadFile(HttpServletRequest request) {

    String fileLocation = request.getParameter("localfile");
    File file = new File(fileLocation);

    Socket socket;
    try {
        socket = new Socket(HOST, PORT);
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());  
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());  

        oos.writeObject(file.getName());  

        FileInputStream fis = new FileInputStream(file);  
        byte [] buffer = new byte[BUFFER_SIZE];  
        Integer bytesRead = 0;  

        while ((bytesRead = fis.read(buffer)) > 0) {  
            oos.writeObject(bytesRead);  
            oos.writeObject(Arrays.copyOf(buffer, buffer.length));  
        }  

        oos.close();  
        ois.close();

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


 public void downloadFile(HttpServletRequest request, HttpServletResponse response) {

        File file = new File(request.getParameter("remotefile"));
        Socket socket;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            socket = new Socket(HOST, PORT);
            response.setContentLength((int)file.length());
            outputStream = response.getOutputStream();
            inputStream = new BufferedInputStream(new FileInputStream(file));
            int nextByte;
            while ((nextByte = inputStream.read()) != -1) {
                outputStream.write(nextByte);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

+3
source share
1 answer

HTTP, HTTP. /, HTTP. , API , .

java.net.URLConnection Apache HttpClient . HTTP () multipart/form-data. HTTP () Content-Type .

URLConnection ( this Apache HttpClient 4). . : InputStream FileOutputStream. , . , URLConnection#getInputStream() FileOutputStream.

+5

Source: https://habr.com/ru/post/1784312/


All Articles