无法使用RESTEasy Web服务下载文件 - 来自Java HTTPClient而不是浏览器

时间:2016-07-20 00:01:30

标签: web-services rest

到目前为止,我一直在搜索解决方案但没有运气!

要求: 我需要从文件系统挂载下载文件,例如。,sample.jpg,并且必须从我的项目应用程序调用请求。所以,我建立了一个Web服务来做它,如果我直接在浏览器上调用Web服务,它工作正常。即,如果我通过下面的浏览器URL调用该服务,则该文件将下载到我系统的浏览器默认下载位置。

例如:http://localhost:8080/appname/rest/downloadservice/images

WebService代码:

@Path("/downloadservice")
public class DownloadFileWS {

    @POST
    @Path("/images")   
    @Produces({"image/jpeg,image/png"})
    public Response getImageFile() { 
        /String FILE_PATH = "/ngs/app/sample.png";

        File file = new File(FILE_PATH);    
        Logger.getLogger("!!!!!!!!!!!"+FILE_PATH);  
        System.out.println("@@@@@@@@"+FILE_PATH);
        ResponseBuilder response = Response.ok((Object) file);  

        response.header("Content-Disposition","attachment; filename=\"sample.png\""); 
        return response.build();  
    }  

所以,这里我的浏览器充当客户端,它检索成功下载的文件。

因为直接通过浏览器URL调用webservice存在安全问题,所以我需要通过我的应用程序java代码(不向最终用户公开)调用上面的webservice。所以,在我的项目应用程序java代码中,我构建了HTTPClient并调用Web服务,如下所示。

客户代码:

public void getFileDownload(){  
        log("inside getServerPath....");
        DefaultHttpClient httpClient = new DefaultHttpClient();

        HttpPost httpPost = new HttpPost(downloadWebService_URL);
        JSONObject json = new JSONObject();
        json.put("filePath", "/ngs/app/sample.png");
        json.put("fileName", "sample.png");

        log("json-->"+json.toString());

        StringEntity inputJson = null;
        try {
            inputJson = new StringEntity(json.toString());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } 
        log("inputJson = " + inputJson.toString());

        inputJson.setContentType("application/json");
        httpPost.setEntity(inputJson);
        httpPost.addHeader("AppType", "TC");

        log("httpPost... httpPost");
        HttpResponse response = null; 
        try {
            response = httpClient.execute(httpPost);
            log("response:-->"+response);
            log("response.getEntity()-->"+response.getEntity());
            log("response.getEntity().getContent()-->"+response.getEntity().getContent());


            response.setHeader("Content-Disposition", "attachment; filename=\"sample.png\"");

            InputStream is = response.getEntity().getContent();
            log("111");
            String filePath = "sample.txt";
            log("222"); 
            FileOutputStream fos = new FileOutputStream(new File(filePath));
            log("333"); 
            int inByte;
            while((inByte = is.read()) != -1){
                 fos.write(inByte);
                 log("444");
            }
            is.close();
            fos.close();

            log("completed...");
        }
        catch (ClientProtocolException e) {
            e.printStackTrace();
        }
        catch (IOException e) { 
            e.printStackTrace();
        }

        catch (Exception e) 
        {
            log("E:: " + ExceptionUtils.getStackTrace(e));
        }
    }

当我点击我的应用程序中的图像链接时,我触发了我上面说的客户端java代码(getFileDownload()方法),后者又使用DefaultHttpClient调用Web服务。

问题1: 客户端java代码正在调用Web服务,我的上述Web服务正在返回响应,如下所示

  

HTTP / 1.1 200 OK [日期:星期二,2016年7月19日21:47:42 GMT,Content-Length:   6192,Content-Type:image / jpeg,Content-Disposition:attachment;   filename =" sample.png",X-Powered-By:Servlet / 2.5 JSP / 2.1]   org.apache.http.conn.BasicManagedEntity@35ae84bf

WebService将响应作为文件下载返回,但由于我的HTTPClient java代码收到响应,我不知道如何使用从我的webservice收到的HTTPResponse,类似于在浏览器中下载文件。如果我单击我的应用程序中的链接,则不会下载文件,但请求和响应通信如上所述发生。

问题2:

有没有办法在客户端java代码,我们可以在从WebService HTTPResponse对象获得响应后实现文件下载?

问题3:

我应该改变我的方法,如下面的链接?

  

Upload/Download File using REST or Web Services

欢迎任何建议!提前谢谢!

0 个答案:

没有答案