Отправка файлов с сервера на клиент в Java - PullRequest
2 голосов
/ 23 февраля 2011

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

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

1 голос
/ 23 февраля 2011

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

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