파일 업로드 및 다운로드는 웹 개발에서 발생하는 일반적인 문제입니다. 지난 며칠 동안 파일 다운로드가 프로젝트에서 사용되었습니다. 나는 또한 전에 흩어진 방식으로 몇 가지 메모를 받았습니다. 오늘 나는 그것을 조직 할 것입니다. 파일 업로드에는 추가 테스트가 필요합니다. 먼저 파일 다운로드에 대해 이야기 해 봅시다.
1. 파일 다운로드 처리 프로세스
파일 다운로드 프로세스는 실제로 매우 명확합니다. 즉.
1. 파일 이름 또는 파일 경로에 따라 파일을 찾습니다. 특정 전략은 주로 자신의 요구를 기반으로합니다. 요컨대, 시스템이 찾을 수있는 파일의 전체 경로가 필요합니다.
2. 입력 스트림을 가져 와서 대상 파일에서 입력 스트림을 가져옵니다.
3. 출력 스트림을 가져 와서 응답에서 출력 스트림을 가져옵니다.
4. 입력 스트림에서 파일을 읽고 출력 스트림을 통해 파일을 출력하십시오. 이것은 실제 다운로드 실행 프로세스입니다.
5. IO 스트림을 끄십시오.
이것은 주요 프로세스이며, 더 중요한 ContentType 설정 파일 유형 등과 같은 필요한 속성 설정이 있습니다.
2. 더 이상 말하지 말고 코드를 추가하십시오
나는 SpringMVC로 그것을했지만 실제로는 다른 것들에 대해서도 마찬가지입니다. 주로 httpservletresponse 객체와 유효한 대상 파일이 필요합니다.
1. 프론트 데스크 코드
/** 업로드 된 파일 다운로드*/function downloadfromUpload (filename) {wind "/download? dir = download & filename ="+encodeuri (encodeuri (filename));}2. 컨트롤러 코드
/*** 파일 다운로드 (업로드 경로에서 다운로드)** @param request* @param response* @throws ioexception*/ @responsebody @reponsemapping (value = "/download") public void downloadfile (httpservletrequest request, httpservletrequest 요청, filemodel model) 예외 {string filename = urldecoder () "utf-8");/** 업로드 및 다운로드 폴더에서 파일 만 다운로드 할 수 있습니다*/String FolderName = "Download"; if (! stringUtils.isempty (model.getDir ()) && model.getDir (). request.getSession (). getServletContext (). getRealPath ( "/")+ "/"/web-inf/"+ folderName+"/"+ filename; filetools.downloadFile (요청, 응답, FileAbsolUtePath); log.warn ("userId : "+ (integer) (request.getSmeption (")). (request.getSession (). getAttribute ( "username")) + ", 다운로드 파일 :" + fileabolutepath);}여기서 다운로드 로직은 프론트 데스크가 파일 이름 매개 변수를 요청/다운로드하고 제공하면됩니다. 중국어가 달린 코드를 피하기 위해 전경 파일 이름이 매개 변수로 사용될 때 JS 'encodeuri ()를 사용하여 유니 코드 코드로 변경 한 다음 중국어로 디코딩합니다. 또한 프로젝트의 특수 특성으로 인해 여기에서 다운로드하려는 파일은 업로드 및 다운로드 폴더에있을 수 있으므로 여기에는 판단 논리의 일부가 있습니다. 또한 FileModel에서 파일 이름과 요청 된 폴더 이름을 모두 캡슐화합니다.
3. 로직 구현을 다운로드하십시오.
여기에는 서비스가 없지만 정적 메소드를 사용하여 직접 구현됩니다.
/*** 파일을 다운로드 할 때 다운로드 이름을 지정** @param request* httpservletrequest* @param 응답* @param filepath* 파일의 전체 경로* @param filename* 클라이언트 다운로드* @throws ioexception*/public void file (httpservletretresconce) (httppservletrepronce). 응답, 문자열 FilePath, String Filename)는 ioException을 던졌습니다. {bufferedInputStream bis = null; bufferedOutputStream bos = null; bis = new bufferedInputStream (fileInputStream (filepath)); bos = new bufferedoutputStream (response.getOutputStream ()); file (filepath) .length (); response.setcharacterencoding ( "utf-8"); response.setContentType ( "multipart/form-data");/** 각 브라우저의 중국어 문제 해결*/String userAgent = request.getheader ( "사용자-에이전트"); bytes = userAgent.contains ( "msie")? filename.getBytes () : filename.getBytes ( "UTF-8"); // filename.getBytes ( "UTF-8") SAFARI FILENAME = New String (BYTES, "ISO-8859-1")에서 스크램블 코드 문제를 처리합니다. // 모든 브라우저는 기본적으로 ISO 인코딩 응답을 지원합니다 .SetHeader ( "content-disposition", string.format ( "첨부 파일; filename =/"%s/"", filename); response.setheader ( "content-length", string.valueof (filelgrength)); byte [] by byte [2048]; bis.read (buff, 0, buff.length))) {bos.write (buff, 0, bytesread);} bis.close (); bos.close ();}/*** 파일을 다운로드 할 때 파일 이름이 지정되지 않습니다* @param request* httpervletrequest* httpservletr response* @param filep the the the the the the the the the the the the the pater* @param request* @param reques. @Throws ioException*/public static void downloadFile (httpservletrequest 요청, httpservletrepsonge 응답, 문자열 파일)은 ioexception {file file = new File (FilePath); DownloadFile (요청, 응답, Fillepath, file.getname ())를 던졌습니다.다음은 클라이언트가 다운로드 한 파일 이름을 때때로 지정해야 할 필요성을 해결하기 위해 과부하 된 다운로드 방법입니다.
3. 주목할만한 것들
1. 마임 유형의 선택에 대해
이전에 MIME 유형에 대해 많이 알지 못했지만 인터넷에 다양한 설정이있는 많은 다운로드 소스 코드가 있다는 것을 알았습니다. 그것이이 문장입니다
Response.setContentType ( "multipart/form-data");
여기에서 MIME 유형을 설정하는 기능 중 하나는 클라이언트 브라우저에 어떤 형식으로 다운로드 할 파일을 처리하도록 지시하는 것입니다. 특정 해당 웹 사이트에는 많은 설명이 있습니다. 이 유형의 클래스 I 가이 형식으로 설정되면 형식은 일반적으로 자동으로 일치합니다.
2. 클라이언트 다운로드 파일 이름을 지정하십시오
때로는 클라이언트가 파일을 다운로드 할 때 파일 이름을 지정해야 할 수도 있습니다.
response.setheader ( "내용화", String.format ( "첨부 파일; filename =/"%s/"", filename);
파일 이름은 사용자 정의 할 수 있습니다. 앞 부분은 움직이지 않아야합니다.
3. 중국인의 문제를 해결하십시오
중국어 파일을 잡아 당기는 것은 너무 일반적입니다. 프로젝트 시스템 아키텍처가 처음 구축되면 편집기, 페이지 및 데이터베이스를 포함하여 모든 중국 인코딩을 통합해야합니다. UTF-8 인코딩이 권장됩니다. Spring을 사용하는 경우 Spring의 문자 세트 필터를 구성하여 중국어가 달린 코드를 더 피할 수도 있습니다.
(1) 클라이언트 다운로드 요청 프로세스의 파일 이름이 차단되었습니다.
때때로 우리는 그것을 만난다. 프론트 데스크 페이지에 중국 파일 이름 다운로드 목록이 표시되면 정상이지만 배경으로 이동하면 요청의 파일 이름이 차가됨을 알 수 있습니다. 현재 위에서 언급 한 Encodeuri를 사용하여 문제를 해결할 수 있습니다.
(2) 클라이언트가 다운로드하고 실행할 때 파일 이름이 잡힌 파일 이름
실제 테스트에서 다른 브라우저가 실행할 수있을 때 IE의 중국 파일 이름이 밝혀 질 수 있음이 밝혀졌습니다. 나는 그런 코드를 온라인으로 보았다. 테스트 후, 다른 브라우저에서 중국인의 문제를 완벽하게 해결했습니다.
/** 각 브라우저의 중국어가 달린 문제 해결*/String userAgent = request.getheader ( "user-agent"); byte [] bytes = userAgent.contains ( "msie")? filename.getBytes () : filename.getBytes ( "UTF-8"); // filename.getBytes ( "UTF-8") SAFARI FILENAME = New String (BYTES, "ISO-8859-1")의 갈색 문제를 처리합니다. // 모든 브라우저는 기본적으로 ISO 인코딩 응답을 지원합니다 .SetHeader ( "Content-Disposition", String.Format ( "첨부; filename =/"%s/"", filename);
(3) 서버에서 파일을 잡았습니다
플랫폼에 따라 다른 서버도 다를 수 있으므로 여기에서주의를 기울여야합니다. 특정 솔루션은 이전에 작성한 기사를 참조하십시오. 파일 다운로드 중에 중국어가 많은 처리.
위의 것은 Java Web 구현 파일 다운로드 및 편집자가 귀하에게 소개 한 Barbled Processing Method입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!