参考资料
Springboot为描述资源提供了适当的接口,主要实现类为ClassPathResource、FileSystemResource、UrlResource、ByteArrayResource、servletconces
ClassPathResource可用于检索类路径下的资源文件。 如果存在位于类路径下的资源文件test.txt,则可以通过指定相应资源文件的类路径下的路径path、newclasspathresource(「test.txt”)来获取该文件。
要获取文件系统中的资源,请使用文件系统资源。 可以根据资源文件的文件路径生成文件系统资源。 文件系统资源还可以将内容写入相应的资源文件。 当然,前提是当前资源文件是可写的。 这可以通过其isWritable ()方法来确定。 FileSystemResource公开了相应资源文件的输出流,可以通过getOutputStream ()方法获得。
URL资源可用于表示与URL对应的资源,从而方便地封装URL。 可以通过指定URL地址来生成URL资源。
ByteArrayResource是为字节数组封装的资源,需要字节数组才能生成。
ServletContextResource是ServletContext封装的资源,用于访问ServletContext环境中的资源。 ServletContextResource具有对ServletContext的引用,其基础是通过ServletContext的getResource (方法和getResourceAsStream ) )方法获取资源
InputStreamResource是为输入流封装的资源,其生成需要输入流。
Resource接口主要定义了以下方法:
exists () :用于确定对应的资源是否真的存在。
isReadable (:用于确定相应资源的内容是否可读。 必须注意的是,如果结果为true,则该内容不一定真的可以读取,但如果返回false,则该内容一定不能读取。
isOpen ) :用于确定当前资源是否表示打开的输入流。 如果结果为真,则无法多次读取当前资源的输入流。 此外,读取后必须关闭,以防止内存泄漏。 此方法主要面向InputStreamResource,在实现类中只有它返回true,否则返回false。
getURL () :返回与当前资源相对应的URL。 如果当前资源无法解析为URL,则抛出异常。 对于ByteArrayResource,无法解析为URL。
返回与getFile ()当前资源相对应的File。 如果当前资源无法通过绝对路径解析为文件,则会抛出异常。 对于ByteArrayResource,无法解析为一个文件。
getInputStream () :获取当前资源代表的输入流。 每当调用getInputStream ()方法时,非InputStream resource resource实现类都会返回新的inputstream。
还有类似于Java文件的接口,如getName和getContenLength。
如果需要获取本地文件系统的指定路径下的文件,有多种方法
在响应实体中实现
通过编写HttpServletResponse的输出流实现
第一种方法是通过封装响应实体将文件流写入主体。 请在这里注意。 文件的格式必须根据特定文件的类型进行设置。 通常,默认值为应用程序/octet-stream。 在标头中设置缓存和文件的名称。 写入文件的名称后,可以避免文件随机生成名称而无法识别的问题。
遇到中文文件名需要转码处理
//设置下载时的文件名。 中文文件名需要转码。 否则就是乱码
headers.add (内容位置),
'附件; filename='
newstring(file.getfilename ().getbytes ) ) utf-8 )、(iso-8859-1 ) )
java
@requestmapping(value='/down ',method=RequestMethod.GET ) )。
publicresponseentitydownloadfile (
throws IOException {
字符串文件路径=' d :/spring实战(第4版(.pdf );
filesystemresourcefile=newfilesystemresource;
httpheadersheaders=newhttpheaders (;
headers.add(cache-control )、) no-cache、no-store、must-revalidate );
//设置下载时的文件名。 中文文件名需要转码。 否则就是乱码
headers.add (内容位置),
'附件; filename='
newstring(file.getfilename ().getbytes ) ) utf-8 )、(iso-8859-1 ) )
headers.add('pragma )、' no-cache );
headers.add('expires ','0' );
返回响应实体
.确定() )。
. headers(headers ) )。
. contentlength (file.contentlength ) )
. content type (media type.parse media type (应用程序/octet-stream ) )
. body (文件);
}
转载于链接:https://my.oschina.net/ahao boy/blog/1843572