programing

첨부 파일에 대한 HTTP 응답 헤더 내용 처리

stoneblock 2023. 8. 22. 21:48

첨부 파일에 대한 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꼬리표

해결책

  1. 바꾸다<a4j:commandButton .../>로.<h:commandButton .../>.
  2. 소스 코드 업데이트:
    1. 바꾸다bw.write( getDomainDocument() );로.bw.write( document );.
    2. 더하다String document = getDomainDocument();의 제일선까지try/catch.
  3. 변경할 내용<a4j:outputPanel.../>(표시되지 않음) ~<h:messages showDetail="false"/>.

기본적으로 다음과 관련된 모든 Ajax 기능을 제거합니다.commandButton오류 메시지를 표시하고 RichFaces UI 스타일을 활용할 수도 있습니다.

레퍼런스

사용해 보십시오.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