SpringMVC ajax技術無刷新文件上傳下載刪除示例


參考

Spring MVC中上傳文件實例

SpringMVC結合ajaxfileupload.js實現ajax無刷新文件上傳

Spring MVC 文件上傳下載 FileOperateUtil.java 壓縮,重命名工具類)

controller代碼

@Controller
@RequestMapping(value = "/file")
public class FileController extends BaseController {
    /**
     * 上傳文件
     *
     * @return JSON
     * @throws Exception
     */
    @ResponseBody
    @RequestMapping(value = "/upload")
    public Message upload(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        logBefore(logger, "上傳文件");

        Message message = new Message();
        PageData pd = new PageData();
        pd = this.getPageData();

        // 這里實現文件上傳操作用的是commons.io.FileUtils類,它會自動判斷/upload是否存在,不存在會自動創建
        String realPath = request.getSession().getServletContext() .getRealPath("/upload/file");
        logBefore(logger, "realPath: " + realPath);
        
        // 上傳文件的原名(即上傳前的文件名字)
        String originalFilename = null;
        // 如果只是上傳一個文件,則只需要MultipartFile類型接收文件即可,而且無需顯式指定@RequestParam注解
        // 如果想上傳多個文件,那么這里就要用MultipartFile[]類型來接收文件,並且要指定@RequestParam注解
        // 上傳多個文件時,前台表單中的所有<input
        // type="file"/>的name都應該是file,否則參數里的file無法獲取到所有上傳的文件
        MultipartFile file = FileUpload.getMultipartFileByName(request, "file");
        if (file.isEmpty()) {
            message.response = ResponseStatus.FAILED.getStatus();
            message.message = "請選擇文件后上傳!";
        } else {
            originalFilename = file.getOriginalFilename();
            logBefore(logger, "文件原名: " + originalFilename);
            logBefore(logger, "文件名稱: " + file.getName());
            logBefore(logger, "文件長度: " + file.getSize());
            logBefore(logger, "文件類型: " + file.getContentType());
            logBefore(logger, "========================================");
            try {
                // 這里不必處理IO流關閉的問題,因為FileUtils.copyInputStreamToFile()方法內部會自動把用到的IO流關掉
                // 此處也可以使用Spring提供的MultipartFile.transferTo(File dest)方法實現文件的上傳
                FileUtils.copyInputStreamToFile(file.getInputStream(), new File(realPath, originalFilename));
            } catch (IOException e) {
                logBefore(logger, "文件[" + originalFilename + "]上傳失敗,堆棧軌跡如下");
                e.printStackTrace();
                message.response = ResponseStatus.FAILED.getStatus();
                message.message = "出錯,服務器繁忙,請稍后再試。";
            }

        }
        //System.out.println(request.getContextPath() + "/upload/" + originalFilename);
        message.response = ResponseStatus.SUCCESS.getStatus();
        message.message = "上傳成功!";

        return message;
    }

    /**
     * 單條記錄刪除
     *
     * @return JSON
     * @throws Exception
     */
    @ResponseBody
    @RequestMapping(value = "/delete")
    public Message delete() {
        logBefore(logger, "刪除文件");
        PageData pd = new PageData();
        Message message = new Message();
        String file_id = (String) pd.get("file_id");
        // 獲取對應文件名和地址
        String filePath = "";
        //TODO:刪除本地文件,刪除數據庫記錄
        try {
            pd = this.getPageData();
            AccidentService.delete(pd);
            message.response = ResponseStatus.SUCCESS.getStatus();
            message.message = "刪除成功";
        } catch (Exception e) {
            logger.error(e.toString(), e);
            message.response = ResponseStatus.FAILED.getStatus();
            message.message = "出錯,服務器繁忙,請稍后再試。";
        }
        return message;
    }

    /**
     * 獲取數據列表頁
     *
     * @param page
     *            頁面請求對象
     * @return 跳轉頁面
     */
    @RequestMapping(value = "/list")
    public ModelAndView list(HttpServletRequest request, Page page) {
        logBefore(logger, "列表File");
        // if(!Jurisdiction.buttonJurisdiction(menuUrl, "cha")){return null;}
        // //校驗權限
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        //文件儲存地址
        //String realPath = request.getSession().getServletContext() .getRealPath("/upload/file");
        //TODO:獲取數據庫文件信息
        try {
            pd = this.getPageData();
            mv.setViewName("security/files/file_list");
            mv.addObject(Const.SESSION_QX, this.getHC()); // 按鈕權限
        } catch (Exception e) {
            logger.error(e.toString(), e);
        }
        return mv;
    }

    /**
     * 下載文件
     *
     * @param page
     *            頁面請求對象
     * @return 跳轉頁面
     * @throws IOException
     */
    @RequestMapping(value = "/download")
    public ResponseEntity<byte[]> download(HttpServletRequest request,
            HttpServletResponse response, Page page) throws IOException {
        logBefore(logger, "下載File");
        PageData pd = new PageData();
        String file_id = (String) pd.get("file_id");
        // 獲取對應文件名和地址
        String fileName = "1.1.1關於印發《交運集團2016年安全生產工作意見》的通知.doc";
        // fileName = "222";
        String filePath = request.getServletContext().getRealPath(
                "/upload/file")
                + "\\1.doc";
        logBefore(logger, "fileName: " + fileName);
        logBefore(logger, "filePath: " + filePath);
        File file = new File(filePath);
        try {
            fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");// 為了解決中文名稱亂碼問題
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        // 下載文件
        HttpHeaders headers = new HttpHeaders();
        headers.setContentDispositionFormData("attachment", fileName);
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        try {
            return new ResponseEntity<byte[]>(
                    FileUtils.readFileToByteArray(file), headers,
                    HttpStatus.CREATED);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

}

 

其中一個FileUpload類的代碼

 

package com.jiaoyun.util;

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

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;


/**
 * 上傳文件 創建人:James 創建時間:2014年12月23日
 * 
 * @version
 */
public class FileUpload {

    /**
     * @param file
     *            //文件對象
     * @param filePath
     *            //上傳路徑
     * @param fileName
     *            //文件名
     * @return 文件名
     */
    public static String fileUp(MultipartFile file, String filePath, String fileName) {
        String extName = ""; // 擴展名格式:
        try {
            if (file.getOriginalFilename().lastIndexOf(".") >= 0) {
                extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            }
            copyFile(file.getInputStream(), filePath, fileName + extName).replaceAll("-", "");
        } catch (IOException e) {
            System.out.println(e);
        }
        return fileName + extName;
    }

    /**
     * 寫文件到當前目錄的upload目錄中
     * 
     * @param in
     * @param fileName
     * @throws IOException
     */
    private static String copyFile(InputStream in, String dir, String realName) throws IOException {
        File file = new File(dir, realName);
        if (!file.exists()) {
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            file.createNewFile();
        }
        System.out.println(file.getAbsolutePath());
        FileUtils.copyInputStreamToFile(in, file);
        return realName;
    }

    /**
     * @param request
     *            //requst請求
     * @param filePath
     *            //上傳路徑
     * @param fileName
     *            //文件名
     * @return 文件名
     * @throws IOException
     * @throws IllegalStateException
     */
    public static String upload(HttpServletRequest request, String filePath, String fileName)
            throws IllegalStateException, IOException {
        String extName = ""; // 擴展名格式:
        String path = "";
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        // 判斷 request 是否有文件上傳,即多部分請求
        if (multipartResolver.isMultipart(request)) {
            // 轉換成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            // 取得request中的所有文件名
            Iterator<String> iter = multiRequest.getFileNames();
            while (iter.hasNext()) {
                // 取得上傳文件
                MultipartFile file = multiRequest.getFile(iter.next());
                if (file != null) {
                    // 取得當前上傳文件的文件名稱
                    String myFileName = file.getOriginalFilename();
                    // 如果名稱不為“”,說明該文件存在,否則說明該文件不存在
                    if (myFileName.trim() != "") {
                        // 重命名上傳后的文件名
                        if (file.getOriginalFilename().lastIndexOf(".") >= 0) {
                            extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
                        }
                        // 定義上傳路徑
                        path = filePath + "/" + fileName + extName;
                        // System.out.println("---------------------");
                        // System.out.println(path);
                        // System.out.println("---------------------");
                        File localFile = new File(path);
                        file.transferTo(localFile);
                    }
                }
            }

        }
        return extName;
    }
    
    

    /**
     * @param request
     *            //requst請求
     * @param filePath
     *            //上傳路徑
     * @param fileName
     *            //文件名
     * @return 文件名
     * @throws IOException
     * @throws IllegalStateException
     */
    public static String[] uploadMultiple(HttpServletRequest request, String filePath, String[] fileName)
            throws IllegalStateException, IOException {
        String[] extName = new String[fileName.length]; // 擴展名格式:
        String path = "";
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        // 判斷 request 是否有文件上傳,即多部分請求
        if (multipartResolver.isMultipart(request)) {
            // 轉換成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            // 取得request中的所有文件名
            Iterator<String> iter = multiRequest.getFileNames();
            int i = 0;
            while (iter.hasNext()) {
                // 取得上傳文件
                MultipartFile file = multiRequest.getFile(iter.next());
                if (file != null) {
                    // 取得當前上傳文件的文件名稱
                    String myFileName = file.getOriginalFilename();
                    // 如果名稱不為“”,說明該文件存在,否則說明該文件不存在
                    if (myFileName.trim() != "") {
                        // 重命名上傳后的文件名
                        if (file.getOriginalFilename().lastIndexOf(".") >= 0) {
                            extName[i] = file.getOriginalFilename()
                                    .substring(file.getOriginalFilename().lastIndexOf("."));
                        }
                        // 定義上傳路徑
                        fileName[i] = fileName[i].replace(extName[i], "");
                        path = filePath + "/" + fileName[i] + extName[i];
//                        path = fileName[i] + extName[i];
                        File localFile = new File(path);
                        file.transferTo(localFile);
                        System.out.println(localFile.getAbsolutePath());
                    }
                }
                i++;
            }

        }
        return extName;
    }

    /**
     * 從request那里得到所有MultipartFile
     */
    public static List<MultipartFile> getMultipartFileFromRequest(HttpServletRequest request)
            throws IllegalStateException, IOException {
        
        List<MultipartFile> fileList = new ArrayList<MultipartFile>();
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        // 判斷 request 是否有文件上傳,即多部分請求
        if (multipartResolver.isMultipart(request)) {
            // 轉換成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            // 取得request中的所有文件名
            Iterator<String> iter = multiRequest.getFileNames();
            while (iter.hasNext()) {
                MultipartFile file = multiRequest.getFile(iter.next());
                System.out.println(file.getName()+"11111111111");
                if (file != null && file.getSize() > 0) {
                    fileList.add(file);
                }
            }
        }
        return fileList;
    }
    /**
     * @Description:刪除文件
     */
    public static void deleteFile(String bucketName, String key) {
        return;
    }
    public static void deleteFile(String bucketName) {
        return;
    }
    
    /**
     * 從request那里得到所有MultipartFile
     */
    public static MultipartFile getMultipartFileByName(HttpServletRequest request,String name)
            throws Exception {
        MultipartFile file=null;
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        // 判斷 request 是否有文件上傳,即多部分請求
        if (multipartResolver.isMultipart(request)) {
            // 轉換成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            // 取得request中的所有文件名
            Iterator<String> iter = multiRequest.getFileNames();
            while (iter.hasNext()) {
                file = multiRequest.getFile(iter.next());
                if (file != null&&file.getName().equals(name)) {
                    return file;
                }
            }
        }
        return file;
    }
    
    /**
     * 根據文件得到后綴名
     * @param file
     * @return
     */
    public static String getExtNameByString(String file){
        String extName="";
        if (file.lastIndexOf(".") >= 0){
            extName = file.substring(file.lastIndexOf("."));
        }
        return extName;
    }
    
    public static String getExtName(MultipartFile file){
        String extName="";
        if (file.getOriginalFilename().lastIndexOf(".") >= 0){
            extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        }
        return extName;
    }


}

 

 


 

 

html前台頁面代碼

上傳按鈕

<a class="btn red btn-circle btn-sm"
                        href="javascript:importData('file/upload');"> 上傳文件 <i
                        class="fa fa-upload"></i>
                    </a>
                    <script>
                                    function importData(url) {
                                        dialog =    bootbox.confirm({
                                            title : '請選擇文件',
                                            message : '<form id="uploadFileForm" class="form-horizontal"><input type="file" name="file" value="選擇文件" id="uploadFileInput" class="btn sbold green"/></form>',
                                            buttons: {
                                                confirm: {
                                                    label: '上傳',
                                                    className: 'btn-success'
                                                },
                                                cancel: {
                                                    label: '取消',
                                                    className: 'btn-danger'
                                                }
                                            },
                                            callback: function (result) {
                                                if(result){
                                                    var formData = new FormData($( "#uploadFileForm" )[0]); 
                                                    $.ajax({
                                                        type: "POST",
                                                        url: url,
                                                          data: formData,
                                                        dataType:'json',
                                                        async: false,  
                                                        cache: false,  
                                                        contentType: false,  //必須false才會自動加上正確的Content-Type
                                                        processData: false,  //必須false才會避開jQuery對 formdata 的默認處理
                                                        error: function(request) {
                                                            bootbox.alert("網絡異常");
                                                          },
                                                        success: function(data){
                                                              if (data.response == 'true') {
                                                                  bootbox.alert("上傳成功!");
                                                                $table.bootstrapTable('refresh');
                                                                dialog.modal('hide');
                                                            } else {
                                                                bootbox.alert(data.message);
                                                            }
                                                        }
                                                    });
                                                }
                                            }
                                        }); 
                                    }
                                    </script>

 

下載按鈕

<a class="btn default" id="demo_1"
                        href="file/download?file_id=1" target="_blank"> 下載文件 <i
                            class="fa fa-download"></i>
                    </a>

 

刪除按鈕

<a class="btn red" id="demo_1" href="file/delete?file_id=1"> 刪除文件 <i class="fa fa-remove"></i>
                    </a>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM