JAVA-文件上傳

JAVAEE-文件上傳

需要引入的jar文件:commons-fileupload-1.3.2,commons-io-2.5.jar。
下載地址
http://commons.apache.org/proper/commons-fileupload/
http://commons.apache.org/proper/commons-io/

  1. 通過Servlet實現
package com.upload.servlet;

import java.io.File;
import java.io.IOException;
import java.util.List;
...導入需要的包

public class UploadServlet extends HttpServlet {

    private TouXiangService service=new TouXiangServiceImpl();

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        TouXiang tx = new TouXiang();
        try {
            // 文件上傳
            // 可以判斷當前請求是不是二進制,如果不是可以終止代碼
            if (!ServletFileUpload.isMultipartContent(request)) {
                return;
            }
            // 獲得FileItemFactory類
            // 能夠創建文件輸入流的工廠對象
            FileItemFactory factory = new DiskFileItemFactory();
            // 獲得ServletFileUpload對象
            ServletFileUpload upload = new ServletFileUpload(factory);
            // 設置最大上傳大小
            upload.setSizeMax(3 * 1024 * 1024);
            // 設置上傳字符集(好像不好用)
            // upload.setHeaderEncoding("utf-8");

            // 通過upload對象中的parseRequest方法獲得FileItem類型的集合
            List<FileItem> list = upload.parseRequest(request);


            // 遍歷所有表單元素
            for (FileItem fi : list) {
                // 迭代到當前表單元素如果是普通元素
                if (fi.isFormField()) {
                    if (fi.getFieldName().equals("username"))
                        tx.setUsername(fi.getString("utf-8"));

                    if (fi.getFieldName().equals("gender"))
                        tx.setGender(fi.getString("utf-8"));

                } else {
                    // 如果是文件域
                    // 獲得用戶上傳的文件名
                    // String filename = fi.getName();

                    // 使用時間偏移量和隨機數來生成文件名,減少重複機率
                    String sui = (int) (Math.random() * 10000000) + "";
                    String shi = System.currentTimeMillis() + "";
                    //時間+隨機數+上傳文件名的後綴名
                    String filename = shi
                            + sui
                            + fi.getName().substring(
                                    fi.getName().lastIndexOf("."));
                    // System.out.println(filename);
                    // 獲得項目在服務器計算機中的真實路徑
                    String path = this.getServletContext()
                            .getRealPath("upload");

                    fi.write(new File(path + "/" + filename));
                    //設置tx對象中的imgname屬性爲filename
                    tx.setImgname(filename);
                }

            }

        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //寫入數據庫
        int num=service.addTouXing(tx);
        //重定向到顯示頁面
        response.sendRedirect("ShowServlet");
    }

}
  1. 通過springmvc 實現
package com.mvc.controller;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

@Controller
@RequestMapping("uploads.do")
public class UploadsController {

    @RequestMapping
    public String upload(HttpServletRequest request) throws IOException {

        MultipartHttpServletRequest req = (MultipartHttpServletRequest) request;
        //獲取表單裏myfile的數據
        List<MultipartFile> list = req.getFiles("myfile");

        // 獲得真是路徑
        String path = request.getSession().getServletContext()
                .getRealPath("upload");
        for (MultipartFile mf : list) {

            if (mf.isEmpty())
                continue;

            // 獲得輸入流
            InputStream inputStream = mf.getInputStream();

            // 獲得定義文件名,獲得後綴名
            String fname = System.currentTimeMillis()
                    + ""
                    + (int) (Math.random() * 1000000)
                    + mf.getOriginalFilename().substring(
                            mf.getOriginalFilename().lastIndexOf("."));

            // 獲得輸出流
            OutputStream outputStream = new FileOutputStream(path + "\\"
                    + fname);

            int len = 0;
            // 緩衝
            byte[] b = new byte[1024];
            // 循環讀寫
            while ((len = inputStream.read(b)) > 0) {

                outputStream.write(b, 0, len);
            }

            inputStream.close();
            outputStream.close();
        }

        return "redirect:main.jsp";
    }

}

上傳多個


@Controller
@RequestMapping("uploads.do")
public class UploadsController {

    @RequestMapping
    public String upload(HttpServletRequest request) throws IOException {

        MultipartHttpServletRequest req = (MultipartHttpServletRequest) request;
        //獲取表單裏myfile的數據
        List<MultipartFile> list = req.getFiles("myfile");

        // 獲得真是路徑
        String path = request.getSession().getServletContext()
                .getRealPath("upload");
        for (MultipartFile mf : list) {

            if (mf.isEmpty())
                continue;

            // 獲得輸入流
            InputStream inputStream = mf.getInputStream();

            // 獲得定義文件名,獲得後綴名
            String fname = System.currentTimeMillis()
                    + ""
                    + (int) (Math.random() * 1000000)
                    + mf.getOriginalFilename().substring(
                            mf.getOriginalFilename().lastIndexOf("."));

            // 獲得輸出流
            OutputStream outputStream = new FileOutputStream(path + "\\"
                    + fname);

            int len = 0;
            // 緩衝
            byte[] b = new byte[1024];
            // 循環讀寫
            while ((len = inputStream.read(b)) > 0) {

                outputStream.write(b, 0, len);
            }

            inputStream.close();
            outputStream.close();
        }

        return "redirect:main.jsp";
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章