文件下载

本来以为简简单单的文件下载,会很快做完,结果中间出了几个小问题。

  • 中文文件名乱码
  • firefox下载的文件扩展名丢失

既然问题出了,就得解决。一番百度,得如:

  • 如果是IE,则需要用对中文编码
  • 如果是ff、chrome,则需要转成ISO8859-1
  • ff会将空格之后的文本抛弃

既然知道了原因,那就好解决了。
对于问题1,代码如下:

  1. //解决中文乱码的问题
  2. try {
  3. if(request.getHeader("User-Agent").toUpperCase().indexOf("MSIE")>0){
  4. fileName=URLEncoder.encode(fileName, "UTF-8");
  5. }else {
  6. fileName=new String(fileName.getBytes("UTF-8"),"ISO8859-1");
  7. }
  8. System.out.println("fileName:"+fileName);
  9. response.setHeader("Content-Disposition","attachment;filename="+fileName);
  10. } catch (UnsupportedEncodingException e) {
  11. e.printStackTrace();
  12. }

对于问题2,只需要将空格去掉就Ok了,简单的字符替换,如下:

  1. //去掉空格,否则ff下空格后的内容都会丢失
  2. String fileName=fileInfo.getFileName().replace(" ","");

完整版代码如下:

  1. String filePath= Config.getProperty("filePath")+ File.separator+
  2. PubConst.SRCFILECATALOG + fileInfo.getFilePath()+
  3. fileInfo.getFileId()+"."+fileInfo.getSuffixName();
  4. //设置响应头信息
  5. response.reset();
  6. //解决中文乱码的问题
  7. //去掉空格,否则ff下空格后的内容都会丢失
  8. String fileName=fileInfo.getFileName().replace(" ","");
  9. try {
  10. if(request.getHeader("User-Agent").toUpperCase().indexOf("MSIE")>0){
  11. fileName=URLEncoder.encode(fileName, "UTF-8");
  12. }else {
  13. fileName=new String(fileName.getBytes("UTF-8"),"ISO8859-1");
  14. }
  15. System.out.println("fileName:"+fileName);
  16. response.setHeader("Content-Disposition","attachment;filename="+fileName);
  17. } catch (UnsupportedEncodingException e) {
  18. e.printStackTrace();
  19. }
  20. //将文件写入到返回流中
  21. InputStream is=null;
  22. OutputStream os=null;
  23. try {
  24. is=new FileInputStream(filePath);
  25. os=response.getOutputStream();
  26. byte[] buffer=new byte[1024];
  27. int length=0;
  28. while ((length=is.read(buffer))>0){
  29. os.write(buffer,0,length);
  30. }
  31. DbBuss_FileInfo.addDownloadCount(fileInfo.getFileId());
  32. } catch (FileNotFoundException e) {
  33. e.printStackTrace();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. finally {
  38. if(is!=null){
  39. try {
  40. is.close();
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. if(os!=null){
  46. try {
  47. os.close();
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }




posted @ 2015-07-28 17:51  小指  阅读(184)  评论(0编辑  收藏  举报