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