Отправка файлов с сервера на клиент в Java



Я пытаюсь найти способ отправки файлов различных типов с сервера на клиент.



У меня есть этот код на сервере, чтобы поместить файл в массив байтов:



File file = new File(resourceLocation);

byte[] b = new byte[(int) file.length()];
FileInputStream fileInputStream;
try {
fileInputStream = new FileInputStream(file);
try {
fileInputStream.read(b);
} catch (IOException ex) {
System.out.println("Error, Can't read from file");
}
for (int i = 0; i < b.length; i++) {
fileData += (char)b[i];
}
}
catch (FileNotFoundException e) {
System.out.println("Error, File Not Found.");
}


Затем я отправляю клиенту fileData в виде строки. Это прекрасно работает для файлов txt, но когда дело доходит до изображений, я нахожу, что, хотя он создает файл нормально с данными, изображение не открывается.



Я даже не уверен, правильно ли я поступаю.
Спасибо за помощь.

1081   2  

2 ответов:

Если Вы читаете / записываете двоичные данные, вы должны использовать байтовые потоки (InputStream/OutputStream) вместо символьных потоков и стараться избегать преобразований между байтами и символами, как это было в вашем примере.

Для копирования байтов из входного потока в выходной можно использовать следующий класс:

public class IoUtil {

    private static final int bufferSize = 8192;

    public static void copy(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[bufferSize];
        int read;

        while ((read = in.read(buffer, 0, bufferSize)) != -1) {
            out.write(buffer, 0, read);
        }
    }
}
Вы не даете слишком много подробностей о том, как вы соединяетесь с клиентом. Это минимальный пример, показывающий, как передавать некоторые байты клиенту сервлета. (Тебе придется это сделать. установите некоторые заголовки в ответе и соответственно освободите ресурсы).
public class FileServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Some code before

        FileInputStream in = new FileInputStream(resourceLocation);
        ServletOutputStream out = response.getOutputStream();

        IoUtil.copy(in, out);

        // Some code after
    }
}

Не помещайте его в строку с приведением символа. Просто попросите ваш сокет записать массив байтов, который вы получаете из входного потока файла.

Comments

    Ничего не найдено.