传智播客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

相关文章

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小