Several ways of SpringBoot to realize file download
1. Read the file into the memory at one time in the form of a stream, and output it to the front end through the response output stream
@RequestMapping ( "/download" )
public void download ( String path, HttpServletResponse response) {
try {
File file = new File ( path) ;
log. info ( file. getPath ( ) ) ;
String filename = file. getName ( ) ;
String ext = filename. substring ( filename. lastIndexOf ( "." ) + 1 ) . toLowerCase ( ) ;
log. info ( "文件后缀名:" + ext) ;
FileInputStream fileInputStream = new FileInputStream ( file) ;
InputStream fis = new BufferedInputStream ( fileInputStream) ;
byte [ ] buffer = new byte [ fis. available ( ) ] ;
fis. read ( buffer) ;
fis. close ( ) ;
response. reset ( ) ;
response. setCharacterEncoding ( "UTF-8" ) ;
response. addHeader ( "Content-Disposition" , "attachment;filename=" + URLEncoder . encode ( filename, "UTF-8" ) ) ;
response. addHeader ( "Content-Length" , "" + file. length ( ) ) ;
OutputStream outputStream = new BufferedOutputStream ( response. getOutputStream ( ) ) ;
response. setContentType ( "application/octet-stream" ) ;
outputStream. write ( buffer) ;
outputStream. flush ( ) ;
} catch ( IOException ex) {
ex. printStackTrace ( ) ;
}
}
1.1 Download files
@RequestMapping ( "getFile" )
@ResponseBody
public void getFile ( HttpServletResponse response) throws Exception {
File readFile = new File ( "/home/ssx/Music/CloudMusic/夜曲-周杰伦.flac" ) ;
FileInputStream fileInputStream = new FileInputStream ( readFile) ;
response. setHeader ( "content-disposition" , "attachment;filename=" + URLEncoder . encode ( "夜曲-周杰伦.flac" , "utf-8" ) ) ;
ServletOutputStream outputStream = response. getOutputStream ( ) ;
byte [ ] bytes = new byte [ 1024 * 10 ] ;
int read;
do {
read = fileInputStream. read ( bytes) ;
outputStream. write ( bytes, 0 , read) ;
} while ( - 1 != read) ;
IOUtils . closeQuietly ( fileInputStream) ;
IOUtils . closeQuietly ( outputStream) ;
}
2. Write the data in the input stream to the response output stream cyclically, instead of reading it to the memory at one time, and output it to the front end through the response output stream
@RequestMapping ( "/downloadLocal" )
public void downloadLocal ( String path, HttpServletResponse response) throws IOException {
InputStream inputStream = new FileInputStream ( path) ;
response. reset ( ) ;
response. setContentType ( "application/octet-stream" ) ;
String filename = new File ( path) . getName ( ) ;
response. addHeader ( "Content-Disposition" , "attachment; filename=" + URLEncoder . encode ( filename, "UTF-8" ) ) ;
ServletOutputStream outputStream = response. getOutputStream ( ) ;
byte [ ] b = new byte [ 1024 ] ;
int len;
while ( ( len = inputStream. read ( b) ) > 0 ) {
outputStream. write ( b, 0 , len) ;
}
inputStream. close ( ) ;
}
3. Download the network file to the local
@RequestMapping ( "/netDownloadLocal" )
public void downloadNet ( String netAddress, String path) throws IOException {
URL url = new URL ( netAddress) ;
URLConnection conn = url. openConnection ( ) ;
InputStream inputStream = conn. getInputStream ( ) ;
FileOutputStream fileOutputStream = new FileOutputStream ( path) ;
int bytesum = 0 ;
int byteread;
byte [ ] buffer = new byte [ 1024 ] ;
while ( ( byteread = inputStream. read ( buffer) ) != - 1 ) {
bytesum += byteread;
System . out. println ( bytesum) ;
fileOutputStream. write ( buffer, 0 , byteread) ;
}
fileOutputStream. close ( ) ;
}
4. After the network file is obtained from the server, it responds to the front end after being processed by the server
@RequestMapping ( "/netDownLoadNet" )
public void netDownLoadNet ( String netAddress, String filename, boolean isOnLine, HttpServletResponse response) throws Exception {
URL url = new URL ( netAddress) ;
URLConnection conn = url. openConnection ( ) ;
InputStream inputStream = conn. getInputStream ( ) ;
response. reset ( ) ;
response. setContentType ( conn. getContentType ( ) ) ;
if ( isOnLine) {
response. setHeader ( "Content-Disposition" , "inline; filename=" + URLEncoder . encode ( filename, "UTF-8" ) ) ;
} else {
response. setHeader ( "Content-Disposition" , "attachment; filename=" + URLEncoder . encode ( filename, "UTF-8" ) ) ;
}
byte [ ] buffer = new byte [ 1024 ] ;
int len;
OutputStream outputStream = response. getOutputStream ( ) ;
while ( ( len = inputStream. read ( buffer) ) > 0 ) {
outputStream. write ( buffer, 0 , len) ;
}
inputStream. close ( ) ;
}