论坛

主页 » Liferay Portal » English » 3. Development

组合视图 统一视图 树状图
讨论主题 [ 上一个 | 下一个 ]
toggle
Mdu Mdu
Empty file stream calling /api/secure/jsonws/dlfileentry/get-file-as-stream
2013年1月27日 下午12:30
答复

Mdu Mdu

等级: New Member

帖子: 12

加入日期: 2005年10月30日

最近的帖子

LF Info:
Version (Runtime and Source) : 6.1.1.ga2


Client Code Snippet:
 1        BasicHttpContext ctx = new BasicHttpContext();
 2        ctx.setAttribute(ClientContext.AUTH_CACHE, authCache);
 3
 4        HttpPost post = new HttpPost("/api/secure/jsonws/dlfileentry/get-file-as-stream");
 5        List<NameValuePair> params = new ArrayList<NameValuePair>();
 6        params.add(new BasicNameValuePair("fileEntryId", "40522"));
 7        params.add(new BasicNameValuePair("version", "1.0"));
 8
 9        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
10        post.setEntity(entity);
11
12        HttpResponse resp = LiferayPortalDocumentRepositoryImpl.httpclient.execute(targetHost, post, ctx);
13        System.out.println("getFolderById Status:[" + resp.getStatusLine() + "]");
14        System.out.println("getFolderByName Res:[" + resp + "]");


Result:
The response stream in HTTP reponse is empty or of length 0.

Notes:
- Returned JSON is null:
1 json = getJSON(mapping, form, request, response); //com.liferay.portal.struts.JSONAction Line 75



- Returned result (FileInputStream) is NOT null:
1Object returnObj = jsonWebServiceAction.invoke(); //com.liferay.portal.jsonwebservice.JSONWebServiceServiceAction Line 104


Question: How do we return file content?

Thanks.
Varun Shah
RE: Empty file stream calling /api/secure/jsonws/dlfileentry/get-file-as-st
2013年3月8日 上午12:01
答复

Varun Shah

等级: New Member

帖子: 5

加入日期: 2008年11月28日

最近的帖子

Hi ,
Did you get any solution? I am also facing same problem.
If you have any other solution then please share.

Thanks,
Varun Shah
Mdu Mdu
RE: Empty file stream calling /api/secure/jsonws/dlfileentry/get-file-as-st
2013年3月8日 上午5:29
答复

Mdu Mdu

等级: New Member

帖子: 12

加入日期: 2005年10月30日

最近的帖子

Varun - here's what we ended up doing. Probably a hack.

Code Base: liferay-portal-src-6.1.1-ce-ga2

Changed file: JSONWebServiceServiceAction.java:

ORIGINAL:
 1
 2    @Override
 3    public String getJSON(
 4            ActionMapping actionMapping, ActionForm actionForm,
 5            HttpServletRequest request, HttpServletResponse response)
 6        throws Exception {
 7
 8        JSONWebServiceAction jsonWebServiceAction = null;
 9
10        String path = GetterUtil.getString(request.getPathInfo());
11
12        try {
13            if (path.equals("/invoke")) {
14                jsonWebServiceAction = new JSONWebServiceInvokerAction(request);
15            }
16            else {
17                jsonWebServiceAction =
18                    JSONWebServiceActionsManagerUtil.getJSONWebServiceAction(
19                        request);
20            }
21
22            JSONWebServiceActionMapping jsonWebServiceActionMapping =
23                jsonWebServiceAction.getJSONWebServiceActionMapping();
24
25            String actionMethodName = null;
26
27            if (jsonWebServiceActionMapping != null) {
28                Method actionMethod =
29                    jsonWebServiceActionMapping.getActionMethod();
30
31                actionMethodName = actionMethod.getName();
32            }
33
34            checkMethodGuestAccess(
35                request, actionMethodName,
36                PropsValues.JSONWS_WEB_SERVICE_PUBLIC_METHODS);
37
38            Object returnObj = jsonWebServiceAction.invoke();
39
40            if (returnObj != null) {
41                return getReturnValue(returnObj);
42            }
43            else {
44                return JSONFactoryUtil.getNullJSON();
45            }
46        }
47        catch (Exception e) {
48            _log.error(e, e);
49
50            return JSONFactoryUtil.serializeException(e);
51        }
52    }


MODIFIED:
 1
 2    @Override
 3    public String getJSON(
 4            ActionMapping actionMapping, ActionForm actionForm,
 5            HttpServletRequest request, HttpServletResponse response)
 6        throws Exception {
 7
 8        JSONWebServiceAction jsonWebServiceAction = null;
 9
10        String path = GetterUtil.getString(request.getPathInfo());
11
12        try {
13            if (path.equals("/invoke")) {
14                jsonWebServiceAction = new JSONWebServiceInvokerAction(request);
15            }
16            else {
17                jsonWebServiceAction =
18                    JSONWebServiceActionsManagerUtil.getJSONWebServiceAction(
19                        request);
20            }
21
22            JSONWebServiceActionMapping jsonWebServiceActionMapping =
23                jsonWebServiceAction.getJSONWebServiceActionMapping();
24
25            String actionMethodName = null;
26
27            if (jsonWebServiceActionMapping != null) {
28                Method actionMethod =
29                    jsonWebServiceActionMapping.getActionMethod();
30
31                actionMethodName = actionMethod.getName();
32            }
33
34            checkMethodGuestAccess(
35                request, actionMethodName,
36                PropsValues.JSONWS_WEB_SERVICE_PUBLIC_METHODS);
37
38            Object returnObj = jsonWebServiceAction.invoke();
39            
40            if (returnObj instanceof FileInputStream)
41            {
42                FileInputStream fis = (FileInputStream)returnObj;
43                response.setContentType("application/octet-stream");
44                response.addHeader("Content-Type","application/octet-stream");
45                response.setContentType("application/octet-stream");
46                //response.setContentLength((int) pdfFile.length());
47
48                OutputStream responseOutputStream = response.getOutputStream();
49                int ttlBytes = (int)stream(fis,responseOutputStream);
50   
51                response.addHeader("Content-Length",Integer.toString(ttlBytes));
52                response.setContentLength(ttlBytes);
53                return "{filename:'file_entry_content'}";
54            }
55            else
56            {
57                if (returnObj != null) {
58                    return getReturnValue(returnObj);
59                }
60                else {
61                    return JSONFactoryUtil.getNullJSON();
62                }
63            }
64        }
65        catch (Exception e) {
66            _log.error(e, e);
67
68            return JSONFactoryUtil.serializeException(e);
69        }
70    }
71
72    public static long stream(InputStream input, OutputStream output) throws IOException {
73        ReadableByteChannel inputChannel = null;
74        WritableByteChannel outputChannel = null;
75        try {
76            inputChannel = Channels.newChannel(input);
77            outputChannel = Channels.newChannel(output);
78            ByteBuffer buffer = ByteBuffer.allocate(10240);
79            long size = 0;
80
81            while (inputChannel.read(buffer) != -1) {
82                buffer.flip();
83                size += outputChannel.write(buffer);
84                buffer.clear();
85            }
86
87            return size;
88        }
89        finally {
90            if (outputChannel != null) try { outputChannel.close(); } catch (IOException ignore) { /**/ }
91            if (inputChannel != null) try { inputChannel.close(); } catch (IOException ignore) { /**/ }
92        }
93    }   


I hope this helps. I welcome a proper way of fixing this. But if this solution is acceptable, we can also create a patch.