Web---自己写的一个简单云相册~

实现的功能是:

用户可以一次上传一个至多个文件。

用户可以下载其他人上传的图片。

用户可以查看其他所有人的图片。

用户只能删除通过自己IP上传的图片。

用到的技术:

文件上传下载、设计模式、Dom4j、xPath等。

先看下2个页面:

源代码:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.UploadServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>cloudPhotoServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.cloudPhotoServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>DownServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.DownServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>DelServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.DelServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/upload</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>cloudPhotoServlet</servlet-name>
    <url-pattern>/cloudPhoto</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>DownServlet</servlet-name>
    <url-pattern>/servlet/DownServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>DelServlet</servlet-name>
    <url-pattern>/servlet/DelServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>chx云相册</title>
    <script type="text/javascript">
        function delFile(input){
            table = input.parentElement.parentElement.parentElement;//table.nodeName  TBODY

            table.removeChild(input.parentElement.parentElement);
        }
        var t=1;
        function addFile(input){
            tr = input.parentElement.parentElement;
            //alert(tr.nodeName);
            var str = "<td>选择文件:</td>"+
                "<td> <input type=‘file‘ name=‘file"+t+"‘> </td> "+
                "<td>文件说明:</td>"+
                "<td> <input type=‘text‘ name=‘text"+t+"‘> </td> "+
                "<td> <input type=‘button‘ value=‘删除文件‘ onclick=‘delFile(this)‘> </td>";
            tr.insertAdjacentHTML("beforeBegin",str);
        }

        function move(){
            window.location.href="/myPhoto/cloudPhoto";
        }
    </script>

    <style type="text/css">
        #font{
            color:red;
        }

    </style>
  </head>

  <body>
    <h1><font id="font">相册上传:</font></h1>
    <form action="/myPhoto/upload" method="post" enctype="multipart/form-data">
        <table border="1px;double;#ff0000">
            <tr>
                <td>选择文件:</td>
                <td> <input type="file" name="file1"> </td>
                <td>文件说明:</td>
                <td> <input type="text" name="text1"> </td>
                <td> <input type="button" value="删 除 文 件" onclick="delFile(this)"> </td>
            </tr>
            <tr>
                <td colspan=2> <input type="submit" value="上 传 文 件"> </td>
                <td colspan=3> <input type="button" value="添 加 文 件" onclick="addFile(this)"> </td>
            </tr>
        </table>
    </form>
    <form action="/myPhoto/cloudPhoto" method="post" enctype="multipart/form-data">
        <table border="1px;double;#ff0000">
            <tr>
                <td colspan=5><input type="submit" value="进 入 云 相 册" onclick="move()"></td>
            </tr>
        </table>
    </form>
  </body>
</html>

photo.xml:

<?xml version="1.0" encoding="UTF-8"?>
<photos>

</photos>

MyUtils.java:

package cn.hncu.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

public class MyUtils {

    /**
     * @return 获取UUID
     */
    public static String getUUID(){
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * @param uuid
     * @return 通过uuid,获得打散后的路径
     */
    public static String getDir(String uuid){
        String dir1 = Integer.toHexString( uuid.hashCode() & 0xf );
        String dir2 = Integer.toHexString( (uuid.hashCode() & 0xf0)>>4 );
        return "/"+dir1+"/"+dir2;
    }

    //日期时间格式
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
    /**
     * @return 返回的是上传的时候的日期时间
     */
    public static String getCurrentDateTime(){
        return sdf.format(new Date());
    }

}

Dom4jFactory.java:

package cn.hncu.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jFactory {
    private static Document dom=null;
    private static String path;
    //静态块!只会运行一次!特点是在类加载的时候就执行
    static{
        try {
            SAXReader sax = new SAXReader();
            //因为我们的资源已经从myelipse中发布到tomcat服务器中了,所以跟原来的纯Java项目不一样了。
            //利用当前类找到它的类加载器,然后通过该类加载器再去获得资源路径
            path = Dom4jFactory.class.getClassLoader().getResource("photo.xml").getPath();
            //getClassLoader()返回:加载此对象所表示的类或接口的类加载器
            //public URL getResource(String name)返回:读取资源的 URL 对象;如果找不到该资源,或者调用者没有足够的权限获取该资源,则返回 null。
            //此方法首先搜索资源的父类加载器;如果父类加载器为 null,则搜索的路径就是虚拟机的内置类加载器的路径。
            //public String getPath()获取此 URL 的路径部分。
            System.out.println(path);
            dom = sax.read(new FileInputStream(path));
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @return 获取相册的Document
     */
    public static Document getDocument(){
        return dom;
    }

    /**
     * 进行photo.xml的保存,保存到本地
     */
    public static boolean save(){
        try {
            XMLWriter w = new XMLWriter(new FileOutputStream(path));
            w.write(dom);
            w.close();
            return true;
        } catch (UnsupportedEncodingException e) {
            return false;
        } catch (FileNotFoundException e) {
            return false;
        } catch (IOException e) {
            return false;
        }
    }

    public static boolean del(String uuid){
        Node node = dom.selectSingleNode("[@uuid=‘"+uuid+"‘]");
        if(node==null){
            return false;
        }
        node.getParent().remove(node);
        return true;
    }

    /**
     * 测试用
     * @param args
     */
    public static void main(String[] args){
        System.out.println( getDocument() );
    }
}

PhotoModel.java-值对象

package cn.hncu.domain;
/**
 * 值对象封装
 * @author 陈浩翔
 * 2016-7-24
 */
public class PhotoModel {

    private String uuid;//uuid
    private String realName="";//图片真实文件名(上传时的文件名)
    private String ext;//后缀名
    private String dir;//打散后的路径
    private String dateTime;//上传文件的时间
    private String ip;//上传者的IP
    private String desc;//文件的说明
    public String getUuid() {
        return uuid;
    }
    public void setUuid(String uuid) {
        this.uuid = uuid;
    }
    public String getRealName() {
        return realName;
    }
    public void setRealName(String realName) {
        this.realName = realName;
    }
    public String getExt() {
        return ext;
    }
    public void setExt(String ext) {
        this.ext = ext;
    }
    public String getDir() {
        return dir;
    }
    public void setDir(String dir) {
        this.dir = dir;
    }
    public String getDateTime() {
        return dateTime;
    }
    public void setDateTime(String dateTime) {
        this.dateTime = dateTime;
    }
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    @Override
    public String toString() {
        return "PhotoModel [uuid=" + uuid + ", realName=" + realName + ", ext="
                + ext + ", dir=" + dir + ", dateTime=" + dateTime + ", ip="
                + ip + ", desc=" + desc + "]";
    }

}

PhotoDao.java:

package cn.hncu.photoDao.Dao;

import java.util.List;

import cn.hncu.domain.PhotoModel;

public interface PhotoDao {
    /**
     * @param photo
     * @return 数据的保存
     */
    public boolean save(PhotoModel photo);

    /**
     * @return 返回所所有的图片信息
     */
    public List<PhotoModel> getAll();

    /**
     * @param uuid
     * @return 通过uuid 查找那个被封装的值对象
     */
    public PhotoModel getSingleByUuid(String uuid);

    /**
     * @param uuid
     * @return 通过uuid删除photos.xml中该图片的信息
     */
    public boolean deleteXml(String uuid);

    /**
     * @param dir
     * @return 通过路径删除服务器磁盘中该图片的信息
     */
    public boolean deleteFile(String pathFileName);
}

PhotoSerImpl.java:

package cn.hncu.photoDao.impl;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;

import cn.hncu.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.utils.Dom4jFactory;

public class PhotoSerImpl implements PhotoDao{

    @Override
    public boolean save(PhotoModel photo) {
        Document dom = Dom4jFactory.getDocument();

        Element root = dom.getRootElement();
        //添加属性
        Element p = root.addElement("photo");
        p.addAttribute("uuid", photo.getUuid());
        p.addAttribute("realName", photo.getRealName());
        p.addAttribute("dateTime", photo.getDateTime());
        p.addAttribute("ip", photo.getIp());
        p.addAttribute("ext", photo.getExt());
        p.addAttribute("dir", photo.getDir());
        p.addAttribute("desc", photo.getDesc());
        return Dom4jFactory.save();
    }

    @Override
    public List<PhotoModel> getAll() {
        List<PhotoModel> list = new ArrayList<PhotoModel>();
        Document dom = Dom4jFactory.getDocument();
        Element root = dom.getRootElement();
        Iterator<Element> it = root.elementIterator("photo");
        //通过DOM4J获得photo元素的迭代器,也可以通过xPath来找到所有的 photo
        //List<Node> lists = dom.selectNodes("//photo[@uuid]");
        //Iterator<Node> it = lists.iterator();
        while(it.hasNext()){
            Element e = it.next();
            PhotoModel photo = new PhotoModel();
            photo.setUuid(e.attributeValue("uuid"));
            photo.setRealName(e.attributeValue("realName"));
            photo.setDateTime(e.attributeValue("dateTime"));
            photo.setExt(e.attributeValue("ext"));
            photo.setIp(e.attributeValue("ip"));
            photo.setDir(e.attributeValue("dir"));
            photo.setDesc(e.attributeValue("desc"));
            list.add(photo);
        }
        return list;
    }

    @Override
    public PhotoModel getSingleByUuid(String uuid) {
        List<PhotoModel> photos=getAll();
        for(PhotoModel photo:photos){
            if(photo.getUuid().equals(uuid)){
                return photo;
            }
        }
        return null;
    }

    @Override
    public boolean deleteXml(String uuid) {
        Document dom = Dom4jFactory.getDocument();
        Element e = (Element) dom.selectSingleNode("//photo[@uuid=‘"+uuid.trim()+"‘]");
        return e.getParent().remove(e);
    }

    @Override
    public boolean deleteFile(String pathFileName) {
        try {
            File file = new File(pathFileName);
            if(file.exists()){
                file.delete();
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

PhotoDaoFactory.java:

package cn.hncu.photoDao.factory;

import cn.hncu.photoDao.impl.PhotoSerImpl;

/**
 * 工厂方法
 * @author 陈浩翔
 * 2016-7-24
 */
public class PhotoDaoFactory {
    public static PhotoSerImpl getPhotoDao(){
        return new PhotoSerImpl();
    }
}

上传-UploadServlet.java:

package cn.hncu.servlets;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import cn.hncu.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.photoDao.factory.PhotoDaoFactory;
import cn.hncu.utils.Dom4jFactory;
import cn.hncu.utils.MyUtils;

public class UploadServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("<h1>很抱歉,本页面不支持GET方式访问!!!</h1>");
        response.getWriter().print("<a href=‘javascript:history.go(-1)‘>返回上一页</a> ");
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        final PrintWriter out = response.getWriter();

        //防黑-非multipart表单提交
        //使用上传工具的方式
        boolean boo = ServletFileUpload.isMultipartContent(request);
        if(!boo){
            out.print("<h1>不支持普通表单的提交方式!</h1>");
            return;
        }

        File file = new File("d:/photoCache");
        if(!file.exists()){
            file.mkdir();
        }

        DiskFileItemFactory fiFactory = new DiskFileItemFactory(1024*10,file);

        ServletFileUpload upload = new ServletFileUpload(fiFactory);
        upload.setHeaderEncoding("utf-8");//设置文件名编码
        String path = getServletContext().getRealPath("/photos");

        FileItem fi = null;
        try {
            List<FileItem> list = upload.parseRequest(request);
            PhotoModel photo = new PhotoModel();//数据封装---需要7个属性
            photo.setRealName("");
            int cont=0;
            for(FileItem f:list){
                if(cont!=0 && cont%2==0 && !photo.getRealName().equals("")){
                    photo = new PhotoModel();//重新数据封装
                }
                fi=f;
                if(fi.isFormField()){//普通表单组件
                    //得到文件说明
                    String desc = fi.getString("utf-8");
                    photo.setDesc(desc);//#1
                }else{

                    //防黑3-如果在file组件中不选择文件
                    if(fi.getSize()==0){
                        photo.setRealName("");
                        cont++;
                        continue;
                    }
                    String fileName = fi.getName();
                    fileName = fileName.substring( fileName.lastIndexOf("\\")+1);//真实文件名
                    photo.setRealName(fileName);//#2
                    String ext = fileName.substring(fileName.lastIndexOf("."));//扩展名
                    photo.setExt(ext);//#3
                    photo.setDateTime(MyUtils.getCurrentDateTime());//#4
                    photo.setIp( request.getRemoteAddr() );//#5
                    String uuid = MyUtils.getUUID();
                    photo.setUuid(uuid);//#6
                    photo.setDir( MyUtils.getDir(uuid) );//#7

                    //打散目录
                    File dFile = new File(path+photo.getDir());
                    if(!dFile.exists()){
                        dFile.mkdirs();
                    }

                    fi.write(new File(path+photo.getDir()+"/"+photo.getUuid()+photo.getExt()));

                }

                cont++;

                if(cont%2==0 && !photo.getRealName().equals("")){
                    PhotoDao dao = PhotoDaoFactory.getPhotoDao();
                    boo = dao.save(photo);
                    //存入磁盘-法二:FileUtils.copyInputStreamToFile(in, new File(fileName2));//※2※ 把图片文件存储到服务器硬盘
                    photo = new PhotoModel();//重新数据封装
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(fi!=null){
                fi.delete();
            }
            if(Dom4jFactory.save()){
                out.print("<h1>上传成功!</h1>");
                out.print("<a href=‘javascript:history.go(-1)‘>返回上一页</a> ");
            }else{
                out.print("<h1>上传失败!</h1>");
                out.print("<a href=‘javascript:history.go(-1)‘>返回上一页</a> ");
            }
        }
    }
}

显示所有文件-cloudPhotoServlet.java

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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

import cn.hncu.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.photoDao.factory.PhotoDaoFactory;

public class cloudPhotoServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String pwd = (String) request.getParameter("pwd");
        if ("chx".equals(pwd)) {
            doPost(request, response);
        } else {
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().print("<h1>很抱歉,你没有权限访问!!!</h1>");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>CHX云相册</TITLE></HEAD>");
        out.println("  <BODY>");

        out.println("<table border=‘1px;double;#ff0000‘>");
        out.println("<tr>");
        out.println("<td>文件名</td>");
        out.println("<td>上传时间");
        out.println("<td>文件</td>");
        out.println("<td>文件说明</td>");
        out.println("<td>操作</td> ");
        out.println("</tr>");

        String tdWH = "style=‘width:200px; height:200px;‘";

        // 显示所有图片
        PhotoDao dao = PhotoDaoFactory.getPhotoDao();
        List<PhotoModel> photos = dao.getAll();
        for (PhotoModel photo : photos) {
            String fileName = photo.getRealName();
            String time = photo.getDateTime();

            // 输出图片
            String path = request.getContextPath() + "/photos/"
                    + photo.getDir() + "/" + photo.getUuid() + photo.getExt();
            // System.out.println(path);
            // /myPhoto/photos//7/c/a1237a48a6aa451cb22fa78b15bafcea.jpg
            String img = "<a href=‘" + path + "‘><img src=‘" + path + "‘/></a>";
            String desc = photo.getDesc();

            String delStr = "<a href=‘/myPhoto/servlet/DelServlet?uuid="
                    + photo.getUuid() + "‘>删除</a>";
            String downStr = "<a href=‘/myPhoto/servlet/DownServlet?uuid="
                    + photo.getUuid() + "‘>下载</a>";

            out.println("<tr>");
            out.println("<td " + tdWH + "> " + fileName + " </td>");
            out.println("<td " + tdWH + ">" + time + "</td>");
            out.println("<td " + tdWH + ">" + img + "</td>");
            out.println("<td " + tdWH + ">" + desc + "</td>");
            out.println("<td " + tdWH + ">" + delStr + "&nbsp;" + downStr
                    + "</td>");
            out.println("</tr>");
        }

        out.println("<tr>");
        out.println("</tr>");

        out.println("</table>");

        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

删除文件-DelServlet.java

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;

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

import cn.hncu.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.photoDao.factory.PhotoDaoFactory;

public class DelServlet extends HttpServlet {

    //注入
    private PhotoDao dao = PhotoDaoFactory.getPhotoDao();
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String uuid = request.getParameter("uuid");
        String ip = request.getRemoteAddr();
        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();

        PhotoModel photo = dao.getSingleByUuid(uuid);

        if(photo!=null){
            if(!photo.getIp().equals(ip)){
                out.print("<h1>你没有权限删除这个文件!!!</h1>");
                out.print("<a href=‘javascript:history.go(-1)‘>返回上一页</a> ");
                return ;
            }

            //1.删除数据库中的信息
            boolean boo = dao.deleteXml(uuid);

            if(boo){
                String fileName = "photos/"+photo.getDir()+"/"+photo.getUuid()+photo.getExt();
                String pathFileName = getServletContext().getRealPath(fileName);
                if(dao.deleteFile(pathFileName)){
                    //重定向到相册页面
                    response.sendRedirect("/myPhoto/cloudPhoto?pwd=chx");
                }else{
                    out.print("<h1>无法从服务器中删除,文件正在被占用!!!</h1>");
                    out.print("<a href=‘javascript:history.go(-1)‘>返回上一页</a> ");
                }
            }else{
                out.print("<h1>该文件已经不存在!!!</h1>");
                out.print("<a href=‘javascript:history.go(-1)‘>返回上一页</a> ");
            }
        }
    }
}

下载文件-DownServlet.java

package cn.hncu.servlets;

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 cn.hncu.domain.PhotoModel;
import cn.hncu.photoDao.Dao.PhotoDao;
import cn.hncu.photoDao.factory.PhotoDaoFactory;

public class DownServlet extends HttpServlet {
    private PhotoDao dao = PhotoDaoFactory.getPhotoDao();

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

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String uuid = request.getParameter("uuid");
        System.out.println(uuid);
        PhotoModel photo = dao.getSingleByUuid(uuid);
        System.out.println(photo);
        if(photo!=null){
            //设置响应头--内容接收程序--浏览器看到这个响应头,就会把它认为的下载程序打开
            //(如果识别迅雷那么就会自动打开迅雷,如果没有则会打开一个“文件另存为”的对话框)
            response.setContentType("application/force-download");

            String realName = photo.getRealName();

            String agent = request.getHeader("User-Agent");
            System.out.println(agent);
            if(agent.indexOf("Mozilla")!=-1){//火狐浏览器
                response.setHeader("Content-Disposition", "attachment;filename="+ new String(realName.getBytes("GB2312"),"ISO-8859-1"));
            }else{
                //解决中文乱码问题(只要用下面一句对文件名进行编码就行了)
                realName = URLEncoder.encode(realName, "utf-8");//使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式。
                response.setHeader("Content-Disposition", "attachment;filename=\""+realName+"\"");
                //注意:“cttachment;”不能少,否则浏览器会直接在新窗口中打开
            }

            String fileName = "photos/" + photo.getDir()+"/"+photo.getUuid()+photo.getExt();
            String pathFileName = getServletContext().getRealPath(fileName);

            InputStream in = new FileInputStream(pathFileName);
            OutputStream out = response.getOutputStream();

            byte buf[] = new byte[2048];
            int len=0;
            while( (len=in.read(buf))!=-1 ){
                out.write(buf, 0, len);
            }
            out.close();
            in.close();
        }else{
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().println("<h1>该文件已经被删除了</h1>");
        }
    }

}

演示结果

这个我就不演示啦,图片在前面也有,所有的源码我都给了。有兴趣的可以自己取改进一下咯。

其实这个还能上传其他任意类型文件哦,因为我们没有防护后缀名的,而且我们是用字符流传输,全都不会失真(可以当云盘来处理了~~)!!

时间: 2024-10-01 10:33:40

Web---自己写的一个简单云相册~的相关文章

写了一个简单的CGI Server

之前看过一些开源程序的源码,也略微知道些Apache的CGI处理程序架构,于是用了一周时间,用C写了一个简单的CGI Server,代码算上头文件,一共1200行左右,难度中等偏上,小伙伴可以仔细看看,对于学生来说,拿来当简历,含金量还是足够的.如果把程序里所涉及的HTTP协议,Linux下POSIX编程等等搞清楚,我想找工作中肯定是有足够的竞争力的,当然我也只是皮毛而已,不再班门弄斧了,下面简单的说下程序流程吧,方便小伙伴们阅读. 程序源代码:戳我 在说程序流程之前,我先简单说下CGI吧,CG

虚幻4,BP写了一个简单的三线跑酷工程

BP写了一个简单的三线跑酷 链接: http://pan.baidu.com/s/1jILE4V8 密码: 96ua

java写的一个简单学生管理系统[改进]

用Java写的一个简单学生管理系统 import java.util.*; public class student_cj {  public static void main(String[] args){      Scanner in=new Scanner(System.in);   System.out.print("请输入学生人数:");   int num=in.nextInt();//学生人数   String[] str=new String[num];//结合一行数

用qt写的一个简单到不能在简单的上位机

学QT时,写的一个简单得不能再简单的串口上位机,用来控制单片机上的2个LED.假设一个是只有开和关的状态.一个可以调节亮度.上位机的界面如下图: 其中,波特率,数据位,停止位下拉值在设计师里面添加.剩下的功能,基本由代码实现.通信使用的协议也是随便写的.很简单和随意.图片是老弟手绘的. 下面贴代码 (*^__^*) #include "mainwindow.h" #include "ui_mainwindow.h" #include <QtSerialPort

写的一个简单定时器(非独立线程)

//Callback.h #ifndef __CALLBACK_H__ #define __CALLBACK_H__ typedef void (*T_CallBack)(void *); typedef struct { T_CallBack cb; void *obj; }ST_CallBack; int __NewTimer(void* obj, int interval, bool isloop, T_CallBack cb); void __DeleteTimer(int handle

写了一个简单可用的IOC

根据<架构探险从零开始写javaweb框架>内容写的一个简单的 IOC 学习记录    只说明了主要的类,从上到下执行的流程,需要分清主次,无法每个类都说明,只是把整个主线流程说清楚,避免陷入细节中.学习过程最大的收获,框架也是人写的,没学过感觉很神秘高端.现在看来大概率是,未知往往觉得是高不可攀.http://naotu.baidu.com/file/6c3da879a4495b6bd369f71dcb726f05?token=ed8c0d49d4ee7bbd 原文地址:https://ww

浮动布局写了一个简单的页面

正在学习的路上...... 这两天写了一个比较简单的页面,主要使用了浮动和定位.左边的属于滚动页面,右边的list属于固定.先上图片: 主要使用了float:left/right. 1.下面是HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <link type="

写了一个简单的jquery插件(初恋啊)

用了好久的jquery了,却没有写过插件,今天研究了一个别人的插件和一些文章,总算搞清楚了jquery插件一些写法, 代码写了一个div当鼠标事件发生时的宽高变化情况,基础,代码基础,基础好了,才能研究深入的东西. 1 (function(jQuery){ 2 /* 3 * 插件应该返回一个JQuery对象,以便保证插件的可链式操作. 4 * JQuery插件的机制:jQuery提供了2个用于扩展jQuery功能的方法 5 * jQuery.fn.extend() 6 * jQuery.exte

利用HttpClient写的一个简单页面获取

之前就听说过利用网络爬虫来获取页面,感觉还挺有意思的,要是能进行一下偏好搜索岂不是可以满足一下窥探欲. 后来从一本书上看到用HttpClient来爬取页面,虽然也有源码,但是也没说用的HttpClient是哪个版本的,而且HttpClient版本不一样,导致后面很多类也不一样.于是下载了最新的HttpCient版本,并且对着tutorial和网上的文档试着写一个简单的获取页面的例子,最终证明是可行的,但是也遇到了不少问题,而且这个例子也十分简单. import java.io.IOExcepti