传智播客bbs项目,发表主题附件的上传与下载

2024-04-26 07:32

本文主要是介绍传智播客bbs项目,发表主题附件的上传与下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      今天继续学习bbs项目,汤老师添加了发表主题附件的上传与下载,并对其实现进行了讲解。实现的时候要注意数据库的字符集编码以及上传下载的字符集编码
汤老师先讲解了上传文件遇到的几个问题:
1,上传同名的文件, 则后上传文件的会覆盖已经上传的同名文件,要避免服务器端保存文件的同名。 且中文文件名的显示问题。
2,一个目录下放了很多文件, 则打开的速度就会很慢, 应分类存放,没个文件用日期生成文件上传的当天目录。
3,文件路径问题, 应使用相对路径。
4,控制文件的大小, 超过限制的不能上传,以免填满服务器。
文件上传使用struts中的FormFile 接口,
org.apache.struts.upload.FormFile  formfile 用于 file upload它是一个接口 代表一个从客户端上传的文件,它是upload包中唯一的struts应用程序可以直接引用的接口。
主要方法
void destroy()
           销毁上传文件的所有内容
 java.lang.String getContentType()
         获得上传文件的字符集编码类型
 byte[] getFileData()
    以字节数组的形式返回整个文件的数据
java.lang.String getFileName() 
          返回文件的文件名
 int getFileSize()
         返回文件的大小
 java.io.InputStream getInputStream()
         返回文件的字节输入流
 void setContentType(java.lang.String contentType)
         设置上传文件的字符集编码类型
 void setFileName(java.lang.String fileName)
         设置文件的名字
 void setFileSize(int fileSize)
         设置文件的大小
编写saveFile方法 把上传文件保存到服务器。
public static String saveFile(HttpServletRequest request, FormFile file) {
  //用当天日期设置文件路径
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
  String path = sdf.format(new Date());
  String storePath = request.getSession().getServletContext().getRealPath("/upload") + File.separator
    + path;
  // 如果文件夹不存在,就递归的创建
  if (!new File(storePath).exists()) {
   new File(storePath).mkdirs();
  }
  //使用UUID类 确保保存的文件名的唯一
  String uuidFilename = UUID.randomUUID().toString();
  path += uuidFilename;
  //设置上传文件在服务器应用程序中的路径
  storePath += uuidFilename;

  FileOutputStream out = null;
  try {
   out = new FileOutputStream(storePath);
   out.write(file.getFileData());
  } catch (Exception e) {
   throw new RuntimeException(e);
  } finally {
   try {
    out.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return path;
 }
开始没有创建upload目录,抛出了异常java.io.FileNotFoundException,这是因为FileOutputStream输出文件到指定文件路径,如果没有这个路径,FileOutputStream不会创建,它只能创建文件。


文件下载
  1. 设置contentType为application/x-msdownload
 2.Header: Content-Disposition=attachment;filename=xxx.yy
3 .读取文件的路径要设置好,不然找不到要下载的文件,抛出异常。
public ActionForward download(ActionMapping mapping, ActionForm form, HttpServletRequest request,
   HttpServletResponse response) throws Exception {
  int id =RequestParameterUtil.getInt(request, "id", 0);
  Attachment attachment=attachmentService.getAttachment(id);
  if(attachment==null){
   return null;
  }
  //对文件名进行URL编码
  String fileName=URLEncoder.encode(attachment.getFilename(), "utf-8");
  response.setContentType("application/x-msdownload");
  response.addHeader("Content-Disposition", "attachment;filename="+fileName);
  
  String path=request.getSession().getServletContext().getRealPath("/")+"/upload/"+attachment.getPath();
  FileInputStream in=null;
  try{
  in=new FileInputStream(path);
  OutputStream out=response.getOutputStream();
  
  byte [] buf=new byte[4096];
  for(int len=-1;(len=in.read(buf))!=-1;){
   out.write(buf, 0, len);
  }
  out.flush();
  }finally{
   if(in!=null)
        in.close();
  }

  return null;
 }

这篇关于传智播客bbs项目,发表主题附件的上传与下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936959

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4