첨부 파일에 대한 HTTP 응답 헤더 내용 처리
배경
XML 문서를 브라우저의 응답 스트림에 쓰고 브라우저가 "다른 이름으로 저장" 대화상자를 표시하도록 합니다.
문제
다음 사항을 고려합니다.download()
방법:
HttpServletResponse response = getResponse();
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(
response.getOutputStream() ) );
String filename = "domain.xml";
String mimeType = new MimetypesFileTypeMap().getContentType( filename );
// Prints "application/octet-stream"
System.out.println( "mimeType: " + mimeType );
// response.setContentType( "text/xml;charset=UTF-8" );
response.setContentType( mimeType );
response.setHeader( "Content-Disposition", "attachment;filename="
+ filename );
bw.write( getDomainDocument() );
bw.flush();
bw.close();
Firefox에서는 XML 내용이 브라우저 창에 표시됩니다.IE 7에서는 XML 내용이 표시되지 않습니다. 문서 원본을 봐야 합니다.두 상황 모두 원하는 결과가 아닙니다.
웹 페이지는 단추에 다음 코드를 사용합니다.
<a4j:commandButton action="#{domainContent.download}" value="Create Domain" reRender="error" />
생성된 XML이 다음으로 시작되지 않습니다.<?xml version="1.0"?>
XML 컨텐츠는 다음과 같습니다.
<schema xmlns="http://www.jaspersoft.com/2007/SL/XMLSchema" version="1.0">
<items>
<item description="EDT Class Code" descriptionId="" label="EDT Class Code" labelId="" resourceId="as_pay_payrolldeduction.edtclass"/>
</items>
<resources>
<jdbcTable datasourceId="JNDI" id="as_pay_payrolldeduction" tableName="as_pay.payrolldeduction">
<fieldList>
<field id="payamount" type="java.math.BigDecimal"/>
</fieldList>
</jdbcTable>
</resources>
</schema>
업데이트 #1
다음 코드 행에 유의하십시오.
response.setHeader( "Content-Disposition", "attachment;filename=" + filename );
업데이트 #2
사용.<a4j:commandButton ... />
문제가 있습니다; 단골입니다.<h:commandButton .../>
예상대로 수행합니다.사용<h:commandBUtton .../>
을 막습니다.<a4j:outputPanel .../>
모든 오류 메시지를 새로 고칩니다.
관련 심 메시지입니다.
마임 유형
다음과 같은 MIME 유형은 "다른 이름으로 저장" 대화상자를 트리거하지 않습니다.
"application/octet-stream"
"text/xml"
"text/plain"
질문.
어떤 변화가 원인이 될까요?a4j:commandButton
"다른 이름으로 저장" 대화 상자를 트리거하여 사용자에게 XML 파일을 저장하라는 메시지를 표시합니다.domain.xml
)?
감사해요.
인라인 사용 안 함, 첨부 파일 사용 안 함, 그냥 사용
response.setContentType("text/xml");
response.setHeader( "Content-Disposition", "filename=" + filename );
또는
response.setHeader( "Content-Disposition", "filename=\"" + filename + "\"" );
또는
response.setHeader( "Content-Disposition", "filename=\"" +
filename.substring(0, filename.lastIndexOf('.')) + "\"");
콘텐츠 유형(미디어 유형)을 다음으로 변경해 보십시오.application/x-download
그리고 당신의 콘텐츠 성향은 다음과 같습니다.attachment;filename=" + fileName;
response.setContentType("application/x-download");
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
문제
이 코드에는 다음과 같은 문제가 있습니다.
- Ajax 호출(
<a4j:commandButton .../>
)는 첨부 파일에서 작동하지 않습니다. - 출력 콘텐츠를 먼저 만들어야 합니다.
- 오류 메시지를 표시해도 Ajax 기반을 사용할 수 없습니다.
a4j
꼬리표
해결책
- 바꾸다
<a4j:commandButton .../>
로.<h:commandButton .../>
. - 소스 코드 업데이트:
- 바꾸다
bw.write( getDomainDocument() );
로.bw.write( document );
. - 더하다
String document = getDomainDocument();
의 제일선까지try/catch
.
- 바꾸다
- 변경할 내용
<a4j:outputPanel.../>
(표시되지 않음) ~<h:messages showDetail="false"/>
.
기본적으로 다음과 관련된 모든 Ajax 기능을 제거합니다.commandButton
오류 메시지를 표시하고 RichFaces UI 스타일을 활용할 수도 있습니다.
레퍼런스
- jsf 페이지에서 명령 단추를 사용하여 파일 다운로드
- http://www.coderanch.com/t/483892/JSF/java/when-commandButton-commandLink
- http://seamframework.org/135584.lace
사용해 보십시오.Content-Disposition
머리말
Content-Disposition: attachment; filename=<file name.ext>
이것은 MIME 유형과는 아무런 관련이 없지만, 내용-처분 헤더는 다음과 같아야 합니다.
Content-Disposition: attachment; filename=genome.jpeg;
서버, 프록시 등에 의해 필터링되지 않고 실제로 클라이언트에 올바르게 전달되는지 확인합니다.또한 출력 스트림을 가져오기 전에 헤더 쓰기 순서를 변경하고 헤더를 설정할 수 있습니다.
언급URL : https://stackoverflow.com/questions/5278975/http-response-header-content-disposition-for-attachments
'programing' 카테고리의 다른 글
배경 이미지가 로드되었는지 확인하려면 어떻게 해야 합니까? (0) | 2023.08.27 |
---|---|
Android 설정 방법_우분투의 홈 경로? (0) | 2023.08.22 |
아약스를 동기화하는 방법은 무엇입니까? (0) | 2023.08.22 |
Android Alert Dialog에서 목록 보기를 표시하려면 어떻게 해야 합니까? (0) | 2023.08.22 |
도커-다운로드 default_network 오류 (0) | 2023.08.22 |