2013-05-09 6 views
0

다운로드 할 수있는 파일의 URL이 있습니다. 모양은 다음과 같습니다.getContentType 메서드는 항상 'application/force-download'를 반환합니다.

http://<server>/recruitment-mantis/plugin.php?page=BugSynchronizer/getfile&fileID=139&filehash=3e7a52a242f90c23539a17f6db094d86 

이 파일의 내용 유형을 얻는 방법?

URL url = new URL(stringUrl); 

    URLConnection urlConnection = url.openConnection(); 
    urlConnection.connect(); 

    String urlContent = urlConnection.getContentType(); 

모든 파일에 나에게 application/force-download 콘텐츠 형식을 반환 (상관없이 JPG 또는 PDF 파일) :이 경우 간단한에 그 관리자에게 있습니다. 다운로드 한 파일의 확장자를 설정하고 싶기 때문에 여러 가지 방법이 있습니다. 이 application/force-download 콘텐츠 유형의 '주변을 벗어나는 방법'? 귀하의 도움에 미리 감사드립니다.

답변

1

확인 urlConnection.getHeaderField("Content-Disposition") :

나는이 방법을 시도 할 수 있습니다 자바 7을 참조하십시오. 일반적으로이 헤더는 멀티 파트 콘텐츠의 첨부 파일에 사용되지만 확인하기가 쉽지 않습니다.

해당 헤더가없는 경우, 임시 파일에 대한 URL을 저장하고 의미있는 MIME 타입 얻을 probeContentType를 사용할 수 있습니다

Path tempFile = Files.createTempFile(null, null); 
try (InputStream urlStream = urlConnection.getInputStream()) { 
    Files.copy(urlStream, tempFile, StandardCopyOption.REPLACE_EXISTING); 
} 
String mimeType = Files.probeContentType(tempFile); 

probeContentType가 null을 반환 할 수 있음에 유의을 경우는 없습니다 파일의 유형을 판별하십시오.

+0

예, urlConnection.getHeaderField ("Content-Disposition")가이 문제를 해결했습니다! 나는이 경우에 "attachment : filename :"name_of_file.extension ""과 같은 것을 얻었습니다. 그 후이 문자열을 분할하고 디스크에 저장하는 확장자 만있는 파일 이름을 얻었습니다. 좋은 작품 감사합니다! – caro2

0

이 콘텐츠 유형은 다운로드하는 서버에서 설정 한 것 같습니다. 일부 서버는 이러한 종류의 콘텐츠 형식을 사용하여 브라우저가 파일을 열지 않고 파일을 다운로드하도록합니다. 예를 들어 내 서버가 콘텐츠 유형 "application/pdf"를 반환 할 때 chrome이 pdf로 열려고 시도하지만 서버가 "application/force-download"를 반환하면 브라우저는이를 수행 할 실마리가 없기 때문에 브라우저에 디스크에 저장합니다 이걸로.

올바른 콘텐츠 유형을 반환하도록 서버를 변경하거나 올바른 파일 형식을 얻으려면 다른 추론을 시도해야합니다. 서버는 jpg로 설정하고 exe를 제공하여 항상 거짓말 할 수 있기 때문에. 파일 이름에 대한 http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#probeContentType%28java.nio.file.Path%29

+0

불행히도이 프로젝트에서 Java 7을 사용할 수 없으므로 아마도이 솔루션은 나를위한 것이 아닙니다. – caro2

1

이 응용 프로그램/강제 다운로드 콘텐츠 유형을 어떻게 벗어나나요?

업로드 한 콘텐츠 유형에 동일한 문제가있었습니다. URL로부터 content-type을 신뢰할 수는 있지만 바이트 형 콘텐츠의 내용을 결정하기 위해 콘텐츠 유형 유틸리티를 찾아보기로했습니다.

5 가지 정도의 구현을 시도한 후에 나는 바퀴를 다시 발명하기로 결정하고, magic (5) Unix 컨텐츠 유형 파일을 사용하여 Unix file (1) 명령과 동일한 기능을 구현하는 SimpleMagic package을 릴리스했습니다. 내부 설정 파일을 사용하거나 /etc/magic, /usr/share/file/magic 또는 다른 magic (5) 파일을 읽고 파일 내용을 File, InputStream 또는 byte[]에서 확인할 수 있습니다.

github 소스, javadocs 및 일부 설명서의 위치는 홈 페이지에서 확인할 수 있습니다.

ContentInfoUtil util = new ContentInfoUtil(); 
ContentInfo info = util.findMatch(byteArray); 

그것은 데이터 (File, InputStream, 또는 byte[])이 아닌 파일 이름의 내용에서 작동합니다 SimpleMagic와

, 당신은 다음과 같은 뭔가.

+1

마침내 단순히 작동하는 솔루션. 감사! – Roben

관련 문제