Как я могу отправить универсальный файл в сервис Джерси и получить его правильно? - PullRequest
4 голосов
/ 09 января 2012

Я разрабатываю сервис на Джерси, который использует API Dropbox.

Мне нужно опубликовать универсальный файл в моей службе (служба сможет управлять всеми видами файлов так же, как вы можете использовать API Dropbox).

КлиентSide

Итак, я реализовал простой клиент, который:

  • открывает файл,
  • создает соединение с URL,
  • устанавливает правильный метод HTTP,
  • создает FileInputStream и записывает файл в выходной поток соединения, используя байтовый буфер.

Это код проверки клиента.

public class Client {

  public static void main(String args[]) throws IOException, InterruptedException {
    String target = "http://localhost:8080/DCService/REST/professor/upload";
    URL putUrl = new URL(target);
    HttpURLConnection connection = (HttpURLConnection) putUrl.openConnection();

    connection.setDoOutput(true);
    connection.setInstanceFollowRedirects(false);
    connection.setRequestMethod("POST");
    connection.setRequestProperty("content-Type", "application/pdf");

    OutputStream os = connection.getOutputStream();

    InputStream is = new FileInputStream("welcome.pdf");
    byte buf[] = new byte[1024];
    int len;
    int lung = 0;
    while ((len = is.read(buf)) > 0) {
      System.out.print(len);
      lung += len;
      is.read(buf);
      os.write(buf, 0, len);
    }
  }
}

на стороне сервера

У меня есть метод, который:

  • получает InputStream в качестве аргумента,
  • создает файл с тем же именем и типом исходного файла.

В следующем коде реализован метод теста для получения определенного файла PDF.

@PUT
@Path("/upload")
@Consumes("application/pdf")
public Response uploadMaterial(InputStream is) throws IOException {
  String name = "info";
  String type = "exerc";
  String description = "not defined";
  Integer c = 10;
  Integer p = 131;
  File f = null;
  try {
    f = new File("welcome.pdf");

    OutputStream out = new FileOutputStream(f);
    byte buf[] = new byte[1024];
    int len;
    while ((len = is.read(buf)) > 0)
      out.write(buf, 0, len);
    out.close();
    is.close();
    System.out.println("\nFile is created........");
  } catch (IOException e) {
    throw new WebApplicationException(Response.Status.BAD_REQUEST);
  }

  //I need to pass a java.io.file object to this method
  professorManager.uploadMaterial(name, type, description, c,p, f);

  return Response.ok("<result>File " + name + " was uploaded</result>").build();
}

Эта реализацияработает только с текстовыми файлами.Если я пытаюсь отправить простой файл PDF, полученный файл не читается (после того, как я сохранил его на диске).

Как я могу удовлетворить свои требования?Кто-нибудь может предложить мне решение?

1 Ответ

7 голосов
/ 09 января 2012

Ваш код клиента неисправен.

while ((len = is.read(buf)) > 0) {
  ...
  is.read(buf);
  ...
}

Вы читаете из InputStream дважды в каждой итерации. Удалите оператор read из тела цикла, и все будет в порядке.

Вы также сказали, что код, представленный в вашем вопросе, работает с текстовыми файлами. Я думаю, что это тоже не работает. Чтение дважды из файла, который вы пытаетесь загрузить, означает, что вы загружаете только половину его содержимого. Половина текстового файла - это все еще текстовый файл, но половина PDF - это просто мусор, поэтому вы не можете открыть последний. Вы должны дважды проверить, совпадает ли содержимое загруженного и сохраненного текстового файла с оригиналом.

...