svn中新增的文件无法上传_054 文件上传与下载以及 SVN 的使用

本文详细介绍了文件上传下载的各个步骤,包括获取动态上下文地址、解决中文乱码、限制文件类型和大小等。同时,深入讲解了SVN版本管理的基本概念和入门操作,包括安装、创建版本库、用户管理、权限设置以及客户端Subclipse的使用,帮助读者掌握SVN的实战技巧。
摘要由CSDN通过智能技术生成

9 文件上传与下载

9.1 导入 jar 包

commons-fileupload.jar 依赖于下面的 commons-io.jar 。 commons-io.jar

9.2 文件上传

9.2.1 获取动态上下文地址

用于获取服务端存储文件的位置
//File dir = new File("D:upload"); //这里指服务器的目录下
//File dir = new File("D:Program Filesapache-tomcat-7.0.69-windows-x64apache-tomcat-7.0.69webappsupdownload1WEB-INFupload"); //这里指服务器的目录下
//完善2:动态获取上下文路径
File dir = new File(this.getServletContext().getRealPath("upload"));

9.2.2 上传文件的中文乱码问题

request.setCharacterEncoding("utf-8");

ServletFileUpload fileUpload = new ServletFileUpload(factory);
fileUpload.setHeaderEncoding("utf-8");  //设置上传文件的名字编码格式

//name 
if("name".equals(fileItem.getFieldName())){
    name = fileItem.getString("utf-8"); //按 utf-8 格式编码
}

9.2.3 限制文件上传的类型

//完善4:限制上传文件的类型
if(!"image/png".equals(photoType)){
    request.setAttribute("mess", "文件的类型不正确,应为 png 格式的图片");
    request.getRequestDispatcher("/add.jsp").forward(request,response);
    return;
}

9.2.4 限制文件上传的大小

try {
    //完善3:限制上传文件的大小
    //设置单个上传文件的大小
    fileUpload.setFileSizeMax(200*1024); //限制的单个文件的大小为 200KB
    //设置上传文件的总大小
    fileUpload.setSizeMax(5*200*1024); //限制上传文件的总大小为 1000KB
    //将表单数据封装到 FileItem 对象中
    itemList = fileUpload.parseRequest(request);
} catch (FileUploadException e) {
    e.printStackTrace();
    //若超出文件大小,则 itemList 为 null,直接返回客户端错误信息
    request.setAttribute("mess", "单个文件大小超过限制 200KB");
    request.getRequestDispatcher("/add.jsp").forward(request,response);
    return;
}

9.2.5 使用UUID

用于图片名称,防止图片名重复。
UUID uuid = UUID.randomUUID(); //获取32位的16进制的数
String ufileName = uuid.toString(); //图片 uuid 名
String extName = 
realName.substring(realName.lastIndexOf(".")+1).toLowerCase();//图片格式扩展名
photoName = ufileName+"."+extName;

9.2.6 栗子

  1. 创建 FileItemFactory 工厂
  2. 创建 ServletFileUpload 上传类
  3. 解析 request 对象,获取 FileItem集合
  4. 遍历 FileItem 集合,获取表单数据和非表单数据
package com.bjsxt.servlet;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.bjsxt.entity.Student;
import com.bjsxt.service.StudentService;
import com.bjsxt.service.impl.StudentServiceImpl;

public class AddServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        this.doPost(request, response);

    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //创建 FileItemFactory 工厂
        FileItemFactory factory = new DiskFileItemFactory();

        //创建  ServletFileUpload 上传类
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        fileUpload.setHeaderEncoding("utf-8");  //设置上传文件的名字编码格式

        //解析 request 对象,获取 FileItem集合 
        List<FileItem> itemList  = null;
        try {
            //完善3:限制上传文件的大小
            //设置单个上传文件的大小
            fileUpload.setFileSizeMax(200*1024); //限制的单个文件的大小为 200KB
            //设置上传文件的总大小
            fileUpload.setSizeMax(5*200*1024); //限制上传文件的总大小为 1000KB
            //将表单数据封装到 FileItem 对象中
            itemList = fileUpload.parseRequest(request);
        } catch (FileUploadException e) {
            e.printStackTrace();
            //若超出文件大小,则 itemList 为 null,直接返回客户端错误信息
            request.setAttribute("mess", "单个文件大小超过限制 200KB");
            request.getRequestDispatcher("/add.jsp").forward(request,response);
            return;
        }

        String name = null;
        int age =  0;
        Double score = 0.0;
        String realName = null;  //图片真实名称
        String photoName = null; //图片名称
        String photoType = null; //图片格式类型
        //遍历 FileItem 集合
        for (int i = 0; i < itemList.size(); i++) {
            FileItem fileItem = itemList.get(i);

            if(fileItem.isFormField()){ //是非 file 表单项
                //name 
                if("name".equals(fileItem.getFieldName())){
                    name = fileItem.getString("utf-8"); //按 utf-8 格式编码
                }
                //age
                if("age".equals(fileItem.getFieldName())){
                    age = Integer.valueOf(fileItem.getString());
                }
                //score
                if("score".equals(fileItem.getFieldName())){
                    String sScore = fileItem.getString();
                    score = Double.valueOf(sScore);
                }
            }else{// 是 file 表单项
                if("photo".equals(fileItem.getFieldName())){
                    realName = fileItem.getName();  //获取上传图片名称
                    photoType = fileItem.getContentType(); //获取上传图片的类型
                    //String is = fileItem.getString(); //获取上传图片的资源
                    //System.out.println(photoName+"t"+photoType+"t");

                    //完善4:限制上传文件的类型
                    if(!"image/png".equals(photoType)){
                        request.setAttribute("mess", "文件的类型不正确,应为 png 格式的图片");
                        request.getRequestDispatcher("/add.jsp").forward(request,response);
                        return;
                    }

                    //File dir = new File("D:upload"); //这里指服务器的目录下
                    //File dir = new File("D:Program Filesapache-tomcat-7.0.69-windows-x64apache-tomcat-7.0.69webappsupdownload1WEB-INFupload"); //这里指服务器的目录下
                    //完善2:动态获取上下文路径
                    File dir = new File(this.getServletContext().getRealPath("upload"));
                    //完善1:若文件夹不存在则创建该文件夹
                    if(!dir.exists()){
                        dir.mkdirs();
                    }
                    //完善5:使用UUID 作为图片名
                    UUID uuid = UUID.randomUUID(); //获取32位的16进制的数
                    String ufileName = uuid.toString(); //图片 uuid 名
                    String extName = realName.substring(realName.lastIndexOf(".")+1).toLowerCase();//图片格式扩展名
                    photoName = ufileName+"."+extName;
                    //System.out.println("图片格式扩展名:"+extName);

                    File  file = new File(dir,photoName);

                    //上传到指定的目录下
                    try {
                        fileItem.write(file);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
        //System.out.println(name+"t"+age+"t"+score);

        StudentService service = new StudentServiceImpl();
        Student stu = new Student(name, age, score, realName, photoName, photoType);
        int n = service.save(stu) ; //保存学生信息
        //页面跳转
        if(n!=0){
            //重定向:/后面要跟上下文路径  /stumgr   /stumgr2

            response.sendRedirect(request.getContextPath()+"/servlet/ShowAllServlet");
        }else{
            request.setAttribute("mess", "添加失败!");
            request.getRequestDispatcher("/add.jsp").forward(request, response);
        }

    }

}

9.3 文件下载

使用IO流的方式将服务器的文件资源发送给客户端
中间使用 IOUtils 工具类(org.apache.commons.io.IOUtils)。
注意:流使用后要关闭。
​ 添加响应头说明该文件是的大小、类型及文件名

9.3.1 下载中文名乱码问题

String realName = stu.getRealName();
/*byte[] bytes = realName.getBytes("utf-8");
            String realName2 = new String(bytes,"utf-8");*/ 
String realName2 = null;
String userAgent = req.getHeader("User-Agent").toLowerCase();
if(userAgent.indexOf("trident") >= 0){//如果是 IE 浏览器
    realName2 = URLEncoder.encode(realName,"utf-8");
}else{
    realName2 = new String(realName.getBytes("utf-8"),"iso-8859-1"); //服务器发送给客户端,Get 编码方式反过来
}
resp.setHeader("Content-Disposition", "attachment;filename="+realName2);
OutputStream out = resp.getOutputStream();

9.3.2 栗子

package com.bjsxt.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

import com.bjsxt.entity.Student;
import com.bjsxt.service.StudentService;
import com.bjsxt.service.impl.StudentServiceImpl;

public class DownloadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
            //1. 接受请求数据,学生的ID
            String sId = req.getParameter("id");
            int id = -1;
            try {
                id = Integer.valueOf(sId);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //2. 处理请求数据
            StudentService service = new StudentServiceImpl();
            Student stu = service.findById(id);
            //3. 响应请求数据      使用IO流的方式
            //3.1  获取输入输出流
            String realPath = this.getServletContext().getRealPath("upload");
            File file = new File(realPath+"/"+stu.getPhotoName());
            InputStream is  = new FileInputStream(file);
            // 添加响应头信息
            resp.setContentLength((int)file.length()); //设置响应内容的长度
            resp.setContentType(stu.getPhotoType()); //设置响应内容的格式
            //处理图片真实名称中文乱码问题
            String realName = stu.getRealName();
            /*byte[] bytes = realName.getBytes("utf-8");
            String realName2 = new String(bytes,"utf-8");*/ 
            String realName2 = null;
            String userAgent = req.getHeader("User-Agent").toLowerCase();
            if(userAgent.indexOf("trident") >= 0){//如果是 IE 浏览器
                realName2 = URLEncoder.encode(realName,"utf-8");
            }else{
                realName2 = new String(realName.getBytes("utf-8"),"iso-8859-1"); //服务器发送给客户端,Get 编码方式反过来
            }
            resp.setHeader("Content-Disposition", "attachment;filename="+realName2);
            OutputStream out = resp.getOutputStream();
            //3.2 将输入流复制到输出流中
            IOUtils.copy(is, out);
            //3.3 关闭流
            is.close();
            out.close();

    }

}

10 版本管理与SVN 入门

10.1 版本管理的概念

解决:代码合并、历史版本中的迭代、重复

10.1.2 版本控制软件

a) VSS:Microsoft 提供,Window 平台,小型开发团队所适合的工具。

b) CVS:开源工具,跨平台。绝大多数 CVS 服务已改用 SVN。CVS 已停止维护

c) SVN(Subversion):开源,跨平台,在 CVS 的基础上开发。使用企业众多, 稳定安全,操作简单。集中式版本控制系统。

d) GIT:开源的分布式版本控制系统,用以有效高速的处理从很小到非常大的项

目版本管理。(GITHUB 是一个用 GIT 做版本控制的项目托管平台,B/S 架构。放到 GITHUB 上的代码需要开源,并且是互联网开发)

10de0e2407d2d6b94b308fdbf2d33c93.png

10.2 SVN入门

10.2.1 安装软件

a) 指定软件安装位置和版本库位置

b) 默认端口 443

c) 使用 SVN authentication

10.2.2 创建版本库

a) 创建默认结构 use default struction

b) 默认结构的含义

i. trunk:主干 开发时代码存储的位置,永远是最新的代码

ii. brank:分支 在不影响Trunk 其它用户情况下进行一些关于新功能的探索性或实验性的开发,待新功能完善后它也可以合并到 Trunk 中

iii. tags:标签 历史版本 阶段性里程碑版本 比如 1.0 2.0 3.0

10.2.3 创建用户

10.2.4 创建组

1 0.2.5 为组指定用户

10.2.6 为组指定对版本库的操作权限

​ a) 默认 everyone 具有 read/write 权限,无法删除,要修改为 no access

10.2.7 通过浏览器访问服务器端

10.3 客户端 subclipse

一款 eclipse 中的 SNV 客户端插件。

10.3.1 安装

a) 解压后将其中的 features 和 plugin 文件夹放入MyEclipse 的 dropins 目录下

b) 重新启动MyEclipse,即可自动发现并安装

c) 安装后在 window------preferrences---—team 中可以看到 SVN

10.3.2 提交项目到服务器端

a) 选中项目右键--------team----share project 选择 SVN

b) 提交版本位置、用户名、密码都会由相关服务器管理人员提供。

909697e2279850d8721e04d0acbb5fa8.png

a) 可以选择记住密码,避免多次的重复输入。

b) 提交后会跳到 team synchronizing view,还需要真正同步代码到服务器,同步之前可以选择哪些代码不需要使用 svn 进行管理

c) 提交成功后可以观察版本库容量的变化

d) 提交成功后客户端项目会显示专门的标记,并且增加了相应的.svn 项目,来存储操作记录

7efc53609d4b3b0798869283bdd8185c.png

040d9f05261bd5fa46bad72c4bd1b0da.png

10.3.4 断开和服务器连接

a) team—断开连接 从项目中删除 SVN 元信息

10.3.5 客户端从 SVN 检出项目

a) new--- Project…--------SVN 从 SVN 检出项目

10.3.6 更新和提交操作

a) 更新将服务器最新代码更新到本地;提交是将本地最新代码提交到服务器

b) 提交之前要先更新,因为可能其他程序员期间以及提交了最新代码到服务器

c) 提交一定要给出注释,对提交内容进行说明,作为以后辨别版本的主要依据。

10.3.7 解决冲突

a) 模拟两个用户对一个类进行修改,分别修改相同的方法和增加一个新方法

b) 更新后出现冲突,和冲突方沟通后,对冲突文件给出最终解决方案

c) 还需要 team 标记为解决,相应冲突文件为自动删除,当前文件由冲突状态

转换为已修改状态,待提交

10.3.8 还原没有提交的提交的代码

a) team 还原

10.3.9 还原已经提交的代码

a) 如果最新的代码出现问题,可以直接修改,也可以回滚到之前的某个历史版本,直接使用或者进行修改

b) 查看资源历史记录

c) 根据注释确定要还原的版本,无法确定可以查看或者比较代码

d) 确定版本后,右键选择”从修订班x 回复更改”

e) 可能出现冲突,解决后提交代码到服务器

Bug 与 技巧

  1. 使用 try catch 提高程序健壮性。列如在 servlet 中接受数字类型参数,需要格式转换,这时可以使用 trycatch语句,防止传入的参数有 null 和 空字符串或者其他的字符等等。
//获取请求参数
// 1.1 获取每页的记录数
String sSize = req.getParameter("size");
int size = 5; //每页记录数
try{
    size = Integer.valueOf(sSize);
}catch(NumberFormatException e){
    e.printStackTrace();
}
// 1.2 获取页码索引
String sIndex = req.getParameter("index");
int index = 1;//页码索引 
try {
    index = Integer.valueOf(sIndex);  //null ," "               
} catch (Exception e) {
    e.printStackTrace();
}   
// 1.3 获取当前成绩
String sScore = req.getParameter("score");
Double score = 0.0;             
if(sScore == null || sScore.equals("")){
    sScore = "";
}
try{
    score = Double.parseDouble(sScore);
}catch(NumberFormatException e){
    e.printStackTrace();
}
// 1.4 获取学生姓名
String name = req.getParameter("name");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值