How can I send a generic file to a jersey service

2019-05-06 18:34发布

I'm developing a Jersey service that uses Dropbox's API.

I need to post a generic file to my service (the service would be able to manage every kind of file as well as you can do with the Dropbox API).

Client Side

So, I've implemented a simple client that:

  • opens the file,
  • creates a connection to the URL,
  • sets the correct HTTP method,
  • creates a FileInputStream and writes the file on the connection's outputstream using byte buffer.

This is the client test code.

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);
    }
  }
}

Server Side

I've a method that:

  • gets an InputStream as an argument,
  • creates a file with the same name and type of the original file.

The following code implements a test method to receive a specific PDF file.

@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();
}

This implementation works only with text files. If I try to send a simple PDF the received file is not readable (after I've saved it on disk).

How can I satisfy my requirements? Could anyone suggest me solution?

1条回答
2楼-- · 2019-05-06 18:59

You're client code is faulty.

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

You're reading from the InputStream twice in every iteration. Remove the read statement from the loop's body and you'll be fine.

You've also said that the code presented in your question works with text files. I think that doesn't work either. Reading twice from the file you're trying to upload means you're uploading only half of its contents. Half a text file is still a text file, but half a PDF is only rubbish, so you can't open the latter. You should have double checked if the contents of your uploaded and saved text file is the same as the original.

查看更多
登录 后发表回答