Varias formas de SpringBoot para realizar la descarga de archivos
1. Lea el archivo en la memoria a la vez en forma de flujo y envíelo al front-end a través del flujo de salida de respuesta.
@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 Descargar archivos
@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. Escriba los datos en el flujo de entrada en el flujo de salida de respuesta cíclicamente, en lugar de leerlos en la memoria de una vez, y envíelos al front-end a través del flujo de salida de respuesta.
@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. Descargue el archivo de red al 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. Una vez que el archivo de red se obtiene del servidor, responde al front-end después de ser procesado por el servidor.
@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 ( ) ;
}