真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Web項(xiàng)目中文件上傳Filter處理-創(chuàng)新互聯(lián)

最近遇到一個(gè)文件上傳的項(xiàng)目,而且在這個(gè)項(xiàng)目中遇到的文件上傳的次數(shù)還是挺多的,所以就寫了個(gè)Filter過濾器。這一個(gè)想法還是從一本書上看到的,所以原則上說并不是在下原創(chuàng)。不過因?yàn)檠a(bǔ)充了一點(diǎn)東西,所以,嘿嘿,不說了。

在建湖等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),建湖網(wǎng)站建設(shè)費(fèi)用合理。

首先需要寫個(gè)Filter:

package yin.filter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
public class Uploadfilter implements Filter
{
    private String encoding;
    @Override
    public void destroy()
    {
        
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException
    {
        UploadRequestWrapper uploadRequestWrapper = new UploadRequestWrapper((HttpServletRequest)request);
        chain.doFilter(uploadRequestWrapper, response);
    }
    @Override
    public void init(FilterConfig config) throws ServletException
    {
        encoding = config.getServletContext().getInitParameter("encoding");
        if (encoding == null)
        {
            encoding = "utf-8";
        }
    }
    
    class UploadRequestWrapper extends HttpServletRequestWrapper
    {
        // 文件頭類型
        private static final String MULTIPART_HEADER = "Content-type";
        // 是否是上傳文件
        private boolean multipart;
        //保存提交的數(shù)據(jù)
        private Map params = new HashMap();
        
        @SuppressWarnings("deprecation")
        public UploadRequestWrapper(HttpServletRequest request)
        {
            super(request);
            // 判斷是否是上傳文件
            multipart = request.getHeader(MULTIPART_HEADER) != null && request
                    .getHeader(MULTIPART_HEADER).startsWith("multipart/form-data");
            // 如果是上傳文件
            if (multipart)
            {
                try
                {
                    DiskFileUpload upload = new DiskFileUpload();
                    // 使用apache進(jìn)行上傳
                    // 設(shè)置編碼
                    upload.setHeaderEncoding(encoding);
                    // 解析上傳的數(shù)據(jù)
                    List fileItems = upload.parseRequest(request);
                    // 遍歷
                    for (Iterator it = fileItems.iterator(); it.hasNext();)
                    {
                        // 獲取當(dāng)前的FileItem
                        FileItem item = (FileItem) it.next();
                        
                        // 如果是文本域
                        if (item.isFormField())
                        {
                            params.put(item.getFieldName(), item.getString(encoding));
                        }
                        else
                        {
                            // 替換特殊字符
                            String filename = item.getName().replace("\\", "/");
                            filename = filename.substring(filename.lastIndexOf("/")+1);
                            
                            // 保存到系統(tǒng)臨時(shí)文件夾中
                            java.io.File file = new File(System.getProperty("java.io.tmpdir"), filename);
                            
                            // 新建文件輸出流
                            OutputStream ops = new FileOutputStream(file);
                            // 輸出到文件流中
                            ops.write(item.get());
                            // 關(guān)閉文件流
                            ops.close();
                            
                            // 將值放到Map中
                            params.put(item.getFieldName(), file);
                        }
                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
        @Override
        public Object getAttribute(String name)
        {
            // 如果是上傳文件,則從Map中取值,支持直接獲取文件對(duì)象
            if (multipart && params.containsKey(name))
            {
                return params.get(name);
            }
            return super.getAttribute(name);
        }
        @Override
        public String getParameter(String name)
        {
            // 如果是上傳文件,則從Map中取值,
            if (multipart && params.containsKey(name))
            {
                return params.get(name).toString();
            }
            return super.getParameter(name);
        }
        
        
        
    }
}

好了,F(xiàn)ilter寫完了,那么就修改配置文件web.xml吧,如下:


    Uploadfilter
    yin.filter.Uploadfilter
  
  
    Uploadfilter
    /*
  

以上只是文件上傳的Filter,那么該怎樣使用了。放心,在下會(huì)說滴:

我們現(xiàn)在先寫一個(gè)簡單的上傳的jsp文件,


    
    
        用戶名:
        密  碼:
        頭  像:
             

由于樣式什么的沒有調(diào)整,難看點(diǎn)也是無所謂的吧!

然后在servlet中使用:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        
        
        
        // 讀取表單內(nèi)容
        String name = request.getParameter("uname");
        String psw = request.getParameter("psw");
        File headPic = (File) request.getAttribute("file");
        
        FileWriterWrapper write = new FileWriterWrapper(request, headPic);        
    }

大家有沒有發(fā)現(xiàn),這樣選取表單中的內(nèi)容是比較方便的,那么然后

 FileWriterWrapper write = new FileWriterWrapper(request, headPic);

這一行代碼就是將讀取到的文件寫入到硬盤中了,

package yin.usual;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
public class FileWriterWrapper
{
    public FileWriterWrapper()
    {
        // TODO Auto-generated constructor stub
    }
    
    // 文件寫入的方法
    public FileWriterWrapper(HttpServletRequest request,File file)
    {        
        try
        {
            // 讀取上下文配置,獲取路徑
            ServletContext context = request.getServletContext();
            String filename = context.getInitParameter("filename");
            // 獲取文件保存路徑
            filename = context.getRealPath(filename);
            // 如果路徑不存在,則創(chuàng)建
            if(!new File(filename).isDirectory())
            {
                System.out.println("文件不存在,正在創(chuàng)建。。。");
                new File(filename).mkdirs();
            }
            
            // 獲取文件名
            String picname = file.getName().replace("/", "\\");
            picname = picname.substring(picname.lastIndexOf("\\")+1, picname.length());
            // 獲取文件保存位置
            String path = filename +"\\"+picname;
            System.out.println("文件保存在:" + path);
            
            FileInputStream fis = new FileInputStream(file);
            FileOutputStream fos = new FileOutputStream(path);
            byte[] bs = new byte[1024*1024*4];
            int len = 0;
            while((len = fis.read(bs)) != -1)
            {
                fos.write(bs, 0, len);
            }
            // 關(guān)閉文件
            fis.close();
            fos.close();
            System.out.println("文件寫入成功");
        }
        catch (IOException e)
        {
            System.out.println("文件寫入失敗");
            e.printStackTrace();
        }
    }
}

接下來,大家看看配置:


    filename
    /imgs
  

看到這,不知道大家有沒有一個(gè)疑問,如果表單中的上傳文件有多個(gè),那么怎么辦?如果這樣就需要修改

FileWriterWrapper

類了,可以將獲取上下文配置中的路徑放在Servlet中,這樣就可以了,具體操作在下就不書寫了。。

以上內(nèi)容如有錯(cuò)誤,歡迎指出。。。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。


網(wǎng)站名稱:Web項(xiàng)目中文件上傳Filter處理-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://weahome.cn/article/dhdici.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部