spring : get response as Multipart File from REST WebService

16,924
 I found some interesting answers from multiple stackoverflow questions. 
 Links are given below

file downloading in restful web services

what's the correct way to send a file from REST web service to client?

For Sending single file : (copied from above sources)

@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getFile() {
  File file = ... // Initialize this to the File path you want to serve.
  return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM)
      .header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"" ) //optional
      .build();
}

For Sending Zip file : (copied from above sources)

1) Approach First :

You can use above method to send any file / Zip.

private static final String FILE_PATH = "d:\\Test2.zip";
@GET
@Path("/get")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getFile() {
    File file = new File(FILE_PATH);
    ResponseBuilder response = Response.ok((Object) file);
    response.header("Content-Disposition", "attachment; filename=newfile.zip");
    return response.build();

}

2) Approach Second :

@GET
@Path("/get") 
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public StreamingOutput helloWorldZip() throws Exception {
    return new StreamingOutput(){
    @Override
        public void write(OutputStream arg0) throws IOException, WebApplicationException {
            // TODO Auto-generated method stub
            BufferedOutputStream bus = new BufferedOutputStream(arg0);
            try {
                Thread.currentThread().getContextClassLoader().getResource("");
                File file = new File("d:\\Test1.zip");
                FileInputStream fizip = new FileInputStream(file);
                byte[] buffer2 = IOUtils.toByteArray(fizip);
                bus.write(buffer2);
            } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
        }
    };
}
Share:
16,924
Morez
Author by

Morez

Full Stack Developer

Updated on June 08, 2022

Comments

  • Morez
    Morez almost 2 years

    I am creating POC for RESTFUL Web service using Spring 4.0. Requirement is to receive MultipartFile as Response from REST WEB-Service.

    REST Service Controller

    @RequestMapping(value="/getcontent/file", method=RequestMapping.post)
    public MultipartFile getMultipartAsFileAsObject() {
    
        File file = new File("src/test/resources/input.docx");
        FileInputStream input = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile("file",file.getName(),
                                     "application/docx", IOUtils.toByteArray(input));
    
        return multipartFile        
    }
    

    I call this service using third party Clients and Apache Http Client as well. kindly have a look on output.

    Using Third party REST client ie. Postman

    output looks like Json -

    {
        "name" : "file",
        "originalfilename" : "sample.docx",
        "contentType" : "application/docx",
        "content" : [
                    82,
                    101,
                    97,
                    100,
                    101,    
                    32,
                    32,
                    .
                    .
                    .
                    .
                    .
                ]  
    }
    

    Apache HTTP Client Sample code

    private static void executeClient() {
    HttpClient client = new DefaultHttpClient();
    HttpPost postReqeust = new HttpPost(SERVER_URI);
    
    try{
        // Set Various Attributes
    
        HttpResponse response = client.execute(postReqeust) ;
    
        //Verify response if any
        if (response != null)
        {
            InputStream inputStream = response.getEntity().getContent();
            byte[] buffer = new byte[inputStream.available()];
            inputStream.read(buffer);
    
            OutputStream outputStream = new FileOutputStream
                                       (new File("src/main/resource/sample.docx"));
            outputStream.write(buffer);
            outputStream.flush();
            outputStream.close();
        }
    
    }
    catch(Exception ex){
        ex.printStackTrace();
    }
    

    Output of Apache Http client

    file is getting Created but It is empty. (0 bytes).