springmvc 文件下载报错 getOutputStream() has already been called for this response

springmvc 文件下载报错 getOutputStream() has already been called for this response,第1张

使用struts2 进行文件下载是,总报错:

java.lang.IllegalStateException: getOutputStream() has already been called for this respons

解决办法:

把对应的action的返回设置为空,即可轻松解决。

例如:

public class DownloadFileAction extends ActionSupport implements

ServletRequestAware, ServletResponseAware {

/**

*

*/

private static final long serialVersionUID = -7448748577778248376L

private HttpServletRequest request

private HttpServletResponse response

private String savePath

@Override

public String execute() throws Exception {

String fileName=request.getParameter("fileName")

String fullPath=getSavePath()+"//"+fileName

fileName=new String(fileName.getBytes("utf-8"),"iso-8859-1")

InputStream is=new FileInputStream(fullPath)

int len=0

byte []buffers=new byte[1024]

response.reset()

response.setContentType("application/x-msdownload")

response.addHeader("Content-Disposition", "attachmentfilename=\""+fileName+"\"")

OutputStream os = null

//把文件内容通过输出流打印到页面上供下载

while((len=is.read(buffers))!=-1){

os=response.getOutputStream()

os.write(buffers, 0, len)

}

is.close()

os.flush()

//return SUCCESS//会报错:java.lang.IllegalStateException: getOutputStream() has already been called for this respons

return null//ok

}

public void setServletRequest(HttpServletRequest req) {

this.request=req

}

public void setServletResponse(HttpServletResponse resp) {

this.response=resp

}

@SuppressWarnings("deprecation")

public String getSavePath() {

return request.getRealPath(savePath)

}

public void setSavePath(String savePath) {

this.savePath = savePath

}

}

1. 核心代码

//设置Mime-Type

response.setContentType("application/msword")

//设置下载默认文件名

response.setHeader("Content-Disposition", "attachmentfilename=123.doc")

登录后复制

完整代码

public R<Object>download(@PathVariable String id, HttpServletResponse response) {

File uploadFile = new File(id + ".doc")

//获取后缀名

String suffix = uploadFile.substring(uploadFile.lastIndexOf("."))

String responseType = ResponseTypeUtils.getResponseContentByType(suffix)

response.setContentType(responseType)

response.setHeader("Content-Disposition", "attachmentfilename=" + System.currentTimeMillis() + suffix)

//输入流,通过输入流读取文件内容

try (FileInputStream fileInputStream = new FileInputStream(uploadFile)) {

ServletOutputStream outputStream = response.getOutputStream()

int len

byte[] bytes = new byte[1024]

while ((len = fileInputStream.read(bytes)) != -1) {

outputStream.write(bytes, 0, len)

//刷新一下

outputStream.flush()

}

//关闭资源

outputStream.close()

return R.ok()

} catch (Exception e) {

throw new RuntimeException(e.getMessage(), e)

}

}

登录后复制

当然也可以通过NIO的方式实现代码,具体可参见HttpServletResponse 返回图片的几种方法对比,核心代码如下:

fis.getChannel().transferTo(0,fis.available(),Channels.newChannel(response.getOutputStream()))

登录后复制

3 参考状态码

文件扩展名 Content-Type(Mime-Type) 文件扩展名 Content-Type(Mime-Type)

.*( 二进制流,不知道下载文件类型) application/octet-stream .tif image/tiff

.001 application/x-001 .301 application/x-301

.323 text/h323 .906 application/x-906

.907 drawing/907 .a11 application/x-a11

.acp audio/x-mei-aac .ai application/postscript

.aif audio/aiff .aifc audio/aiff

.aiff audio/aiff .anv application/x-anv

.asa text/asa .asf video/x-ms-asf

.asp text/asp .asx video/x-ms-asf

.au audio/basic .avi video/avi

.awf application/vnd.adobe.workflow .biz text/xml

.bmp application/x-bmp .bot application/x-bot

.c4t application/x-c4t .c90 application/x-c90

.cal application/x-cals .cat application/vnd.ms-pki.seccat

.cdf application/x-netcdf .cdr application/x-cdr

.cel application/x-cel .cer application/x-x509-ca-cert

.cg4 application/x-g4 .cgm application/x-cgm

.cit application/x-cit .class java/*

.cml text/xml .cmp application/x-cmp

.cmx application/x-cmx .cot application/x-cot

.crl application/pkix-crl .crt application/x-x509-ca-cert

.csi application/x-csi .css text/css

.cut application/x-cut .dbf application/x-dbf

.dbm application/x-dbm .dbx application/x-dbx

.dcd text/xml .dcx application/x-dcx

.der application/x-x509-ca-cert .dgn application/x-dgn

.dib application/x-dib .dll application/x-msdownload

.doc application/msword .dot application/msword

.docx application/msword .xlsx application/vnd.ms-excel

.drw application/x-drw .dtd text/xml

.dwf Model/vnd.dwf .dwf application/x-dwf

.dwg application/x-dwg .dxb application/x-dxb

.dxf application/x-dxf .edn application/vnd.adobe.edn

.emf application/x-emf .eml message/rfc822

.ent text/xml .epi application/x-epi

.eps application/x-ps .eps application/postscript

.etd application/x-ebx .exe application/x-msdownload

.fax image/fax .fdf application/vnd.fdf

.fif application/fractals .fo text/xml

.frm application/x-frm .g4 application/x-g4

.gbr application/x-gbr .pptx application/vnd.ms-powerpoint

.gif image/gif .gl2 application/x-gl2

.gp4 application/x-gp4 .hgl application/x-hgl

.hmr application/x-hmr .hpg application/x-hpgl

.hpl application/x-hpl .hqx application/mac-binhex40

.hrf application/x-hrf .hta application/hta

.htc text/x-component .htm text/html

.html text/html .htt text/webviewhtml

.htx text/html .icb application/x-icb

.ico image/x-icon .ico application/x-ico

.iff application/x-iff .ig4 application/x-g4

.igs application/x-igs .iii application/x-iphone

.img application/x-img .ins application/x-internet-signup

.isp application/x-internet-signup .IVF video/x-ivf

.java java/* .jfif image/jpeg

.jpe image/jpeg .jpe application/x-jpe

.jpeg image/jpeg .jpg image/jpeg

.jpg application/x-jpg .js application/x-javascript

.jsp text/html .la1 audio/x-liquid-file

.lar application/x-laplayer-reg .latex application/x-latex

.lavs audio/x-liquid-secure .lbm application/x-lbm

.lmsff audio/x-la-lms .ls application/x-javascript

.ltr application/x-ltr .m1v video/x-mpeg

.m2v video/x-mpeg .m3u audio/mpegurl

.m4e video/mpeg4 .mac application/x-mac

.man application/x-troff-man .math text/xml

.mdb application/msaccess .mdb application/x-mdb

.mfp application/x-shockwave-flash .mht message/rfc822

.mhtml message/rfc822 .mi application/x-mi

.mid audio/mid .midi audio/mid

.mil application/x-mil .mml text/xml

.mnd audio/x-musicnet-download .mns audio/x-musicnet-stream

.mocha application/x-javascript .movie video/x-sgi-movie

.mp1 audio/mp1 .mp2 audio/mp2

.mp2v video/mpeg .mp3 audio/mp3

.mp4 video/mpeg4 .mpa video/x-mpg

.mpd application/vnd.ms-project .mpe video/x-mpeg

.mpeg video/mpg .mpg video/mpg

.mpga audio/rn-mpeg .mpp application/vnd.ms-project

.mps video/x-mpeg .mpt application/vnd.ms-project

.mpv video/mpg .mpv2 video/mpeg

.mpw application/vnd.ms-project .mpx application/vnd.ms-project

.mtx text/xml .mxp application/x-mmxp

.net image/pnetvue .nrf application/x-nrf

.nws message/rfc822 .odc text/x-ms-odc

.out application/x-out .p10 application/pkcs10

.p12 application/x-pkcs12 .p7b application/x-pkcs7-certificates

.p7c application/pkcs7-mime .p7m application/pkcs7-mime

.p7r application/x-pkcs7-certreqresp .p7s application/pkcs7-signature

.pc5 application/x-pc5 .pci application/x-pci

.pcl application/x-pcl .pcx application/x-pcx

.pdf application/pdf .pdf application/pdf

.pdx application/vnd.adobe.pdx .pfx application/x-pkcs12

.pgl application/x-pgl .pic application/x-pic

.pko application/vnd.ms-pki.pko .pl application/x-perl

.plg text/html .pls audio/scpls

.plt application/x-plt .png image/png

.png application/x-png .pot application/vnd.ms-powerpoint

.ppa application/vnd.ms-powerpoint .ppm application/x-ppm

.pps application/vnd.ms-powerpoint .ppt application/vnd.ms-powerpoint

.ppt application/x-ppt .pr application/x-pr

.prf application/pics-rules .prn application/x-prn

.prt application/x-prt .ps application/x-ps

.ps application/postscript .ptn application/x-ptn

.pwz application/vnd.ms-powerpoint .r3t text/vnd.rn-realtext3d

.ra audio/vnd.rn-realaudio .ram audio/x-pn-realaudio

.ras application/x-ras .rat application/rat-file

.rdf text/xml .rec application/vnd.rn-recording

.red application/x-red .rgb application/x-rgb

.rjs application/vnd.rn-realsystem-rjs .rjt application/vnd.rn-realsystem-rjt

.rlc application/x-rlc .rle application/x-rle

.rm application/vnd.rn-realmedia .rmf application/vnd.adobe.rmf

.rmi audio/mid .rmj application/vnd.rn-realsystem-rmj

.rmm audio/x-pn-realaudio .rmp application/vnd.rn-rn_music_package

.rms application/vnd.rn-realmedia-secure .rmvb application/vnd.rn-realmedia-vbr

.rmx application/vnd.rn-realsystem-rmx .rnx application/vnd.rn-realplayer

.rp image/vnd.rn-realpix .rpm audio/x-pn-realaudio-plugin

.rsml application/vnd.rn-rsml .rt text/vnd.rn-realtext

.rtf application/msword .rtf application/x-rtf

.rv video/vnd.rn-realvideo .sam application/x-sam

.sat application/x-sat .sdp application/sdp

.sdw application/x-sdw .sit application/x-stuffit

.slb application/x-slb .sld application/x-sld

.slk drawing/x-slk .smi application/smil

.smil application/smil .smk application/x-smk

.snd audio/basic .sol text/plain

.sor text/plain .spc application/x-pkcs7-certificates

.spl application/futuresplash .spp text/xml

.ssm application/streamingmedia .sst application/vnd.ms-pki.certstore

.stl application/vnd.ms-pki.stl .stm text/html

.sty application/x-sty .svg text/xml

.swf application/x-shockwave-flash .tdf application/x-tdf

.tg4 application/x-tg4 .tga application/x-tga

.tif image/tiff .tif application/x-tif

.tiff image/tiff .tld text/xml

.top drawing/x-top .torrent application/x-bittorrent

.tsd text/xml .txt text/plain

.uin application/x-icq .uls text/iuls

.vcf text/x-vcard .vda application/x-vda

.vdx application/vnd.visio .vml text/xml

.vpg application/x-vpeg005 .vsd application/vnd.visio

.vsd application/x-vsd .vss application/vnd.visio

.vst application/vnd.visio .vst application/x-vst

.vsw application/vnd.visio .vsx application/vnd.visio

.vtx application/vnd.visio .vxml text/xml

.wav audio/wav .wax audio/x-ms-wax

.wb1 application/x-wb1 .wb2 application/x-wb2

.wb3 application/x-wb3 .wbmp image/vnd.wap.wbmp

.wiz application/msword .wk3 application/x-wk3

.wk4 application/x-wk4 .wkq application/x-wkq

.wks application/x-wks .wm video/x-ms-wm

.wma audio/x-ms-wma .wmd application/x-ms-wmd

.wmf application/x-wmf .wml text/vnd.wap.wml

.wmv video/x-ms-wmv .wmx video/x-ms-wmx

.wmz application/x-ms-wmz .wp6 application/x-wp6

.wpd application/x-wpd .wpg application/x-wpg

.wpl application/vnd.ms-wpl .wq1 application/x-wq1

.wr1 application/x-wr1 .wri application/x-wri

.wrk application/x-wrk .ws application/x-ws

.ws2 application/x-ws .wsc text/scriptlet

.wsdl text/xml .wvx video/x-ms-wvx

.xdp application/vnd.adobe.xdp .xdr text/xml

.xfd application/vnd.adobe.xfd .xfdf application/vnd.adobe.xfdf

.xhtml text/html .xls application/vnd.ms-excel

.xls application/x-xls .xlw application/x-xlw

.xml text/xml .xpl audio/scpls

.xq text/xml .xql text/xml

.xquery text/xml .xsd text/xml

.xsl text/xml .xslt text/xml

.xwd application/x-xwd .x_b application/x-x_b

.sis application/vnd.symbian.install .sisx application/vnd.symbian.install

.x_t application/x-x_t .ipa application/vnd.iphone

.apk application/vnd.android.package-archive .xap application

servlet 两种跳转方式:重定向、请求转发

看你的代码像是想给前台页面写入数据, 就是类似ajax

你这out引用我不知道有什么用,写入完了之后也没有放到作用域 ,请求转发到前台没什么用吧。

你这OutputStream out 我想的话 你想的写的是 PrintWriter out = response.getWriter()

你的out是对流 *** 作的,(比如说文件流什么的, 你这对象叫什么输出流),

我的out是对一个输出对象,可以像前台jsp页面直接写html代码。 当然也可以封装成json格式,到前台进行解析。

我猜想你的这个方法是想在servlet中写jsp页面中的html代码。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/8112687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存