练习上传下载时遇到的问题

  • public class BaseServlet extends HttpServlet {
  • @Override
  • protected void service(HttpServletRequest req, HttpServletResponse res)
  • throws ServletException, IOException {
  • //页面的编码处理
  • req.setCharacterEncoding("utf-8");
  • res.setContentType("text/html;charset=utf-8");
  • //获取页面要调用的method参数
  • String methodName = req.getParameter("method");
  • if(methodName==null || methodName.trim().isEmpty()){
  • throw new RuntimeException("您未指定要调用的方法!");
  • }
  • //反射得到要调用的反射方法
  • Class clazz = this.getClass();//所访问servlet的字节码文件对象
  • Method method = null;
  • try {
  • method = clazz.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
  • }
  • catch (Exception e) {
  • throw new RuntimeException("您要调用的方法"+methodName+"(HttpServletRequest,HttpServletResponse)不存在");
  • }
  • //执行方法
  • try {
  • String result = (String)method.invoke(this, req,res);
  • if(result==null || result.trim().isEmpty()){
  • return;
  • }
  • if(result.contains(":")){
  • int addr = result.indexOf(":");
  • String bef = result.substring(0,addr);
  • String aft = result.substring(addr+1);
  • if(bef.equalsIgnoreCase("r")){
  • res.sendRedirect(req.getContextPath()+aft);
  • }else if(bef.equalsIgnoreCase("f")){
  • req.getRequestDispatcher(aft).forward(req, res);
  • }else{
  • throw new RuntimeException("您指定的操作有误");
  • }
  • }else{
  • req.getRequestDispatcher(result).forward(req, res);
  • }
  • } catch (Exception e) {
  • throw new RuntimeException("方法内部错误"+e);
  • }
  • }
  • public class MyFileServlet extends BaseServlet {
  • MyService service = new MyService();
  • public String findAll(HttpServletRequest req,HttpServletResponse res){
  • List<MyFile> list = service.findAll();
  • req.setAttribute("list", list);
  • return "f:/day22/list.jsp";
  • }
  • public String downLoad(HttpServletRequest req,HttpServletResponse res) {
  • String fid = req.getParameter("fid");
  • MyFile myfile = service.load(fid);
  • try {
  • //获取文件资源名称
  • String path = req.getParameter("path");
  • //解析路径
  • String fname = myfile.getFilename();
  • String name = myfile.getName();
  • name = new String(name.getBytes("iso-8859-1"),"utf-8");
  • //封装文件
  • File file = new File(path,fname);
  • if(!file.exists()){
  • req.setAttribute("msg", "您要下载的资源不存在");
  • return "f:/day22/msg.jsp";
  • }
  • int cnt = myfile.getCnt();
  • /*
  • 其中MyFile 类型的cnt属性是Integer的int cnt = myfile.getCnt();
  • * myfile.setCnt(cnt+1);
  • * service.edit(myfile);
  • * 加入此句后会报出 方法内部错误
  • * java.lang.reflect.
  • * InvocationTargetException
  • * 后来将接口参数由myfile对象换成两个
  • * 需要的直接参数,而不是由myfile间接
  • * 获取,问题解决,仔细思考之后发现其实是反射方法的
  • 内部出了问题,也就是说baseservlet反射调用了我的这个
  • 方法,而我这个方法内部有可能在处理或调用其他方法时出现问题
  • * */
  • service.edit(cnt+1,fid);
  • name = new String(name.getBytes("GBK"),"iso-8859-1");
  • res.addHeader("content-disposition", "attatchment;filename="+fname);
  • IOUtils.copy(new FileInputStream(file), res.getOutputStream());
  • } catch (Exception e) {
  • throw new RuntimeException(e);
  • }
  • return null;
  • }
原文地址:https://www.cnblogs.com/itzfz/p/6120460.html