Отправка файлов с сервера на клиент в 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, но когда дело доходит до изображений, я нахожу, что, хотя он создает файл нормально с данными, изображение не открывается.
Я даже не уверен, правильно ли я поступаю.
Спасибо за помощь.
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