簡單上傳下載

上傳

這裏有一個實體 用於存放文件信息 存放路徑commonfile在配置文件中配置

@RestController
public class FileUpload {

    @Value("${commonfile}")
    private String commonfile;

    /**
     * 使用Spring MVC的multipartFile 類作爲參數
     *
     * @param multipartFile
     * @return
     */
    @PostMapping("/upload")
    @ResponseBody
    @ArchivesLog(operationName = "上傳")
    public Result<FileMessage> uploadMultipartFile(@RequestParam("file") MultipartFile multipartFile) {
        Result<FileMessage> result = new Result<FileMessage>();
        FileMessage fileMessageVO = new FileMessage();
        String fileName = multipartFile.getOriginalFilename();
        try {
            // 獲取文件字節數組
            byte[] bytes = multipartFile.getBytes();
            // 文件存儲路徑(/fileupload1/ 這樣會在根目錄下創建問價夾)
            File pfile = new File(commonfile);
            // 判斷文件夾是否存在
            if (!pfile.exists()) {
                // 不存在時,創建文件夾
                pfile.mkdirs();
            }
            // 創建文件
            File file = new File(pfile, fileName);
            // 寫入指定文件夾
            OutputStream out = new FileOutputStream(file);
            out.write(bytes);
            // 組裝對象
            fileMessageVO.setFileName(fileName);
            fileMessageVO.setFileRoute(commonfile);
            fileMessageVO.setFileDownloadUri(commonfile + fileName);
            fileMessageVO.setSize(getPrintSize(file.length()));
            fileMessageVO.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
            result.setData(fileMessageVO);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static String getPrintSize(long size) {
        // 如果字節數少於1024,則直接以B爲單位,否則先除於1024,後3位因太少無意義
        if (size < 1024) {
            return String.valueOf(size) + "B";
        } else {
            size = size / 1024;
        }
        // 如果原字節數除於1024之後,少於1024,則可以直接以KB作爲單位
        // 因爲還沒有到達要使用另一個單位的時候
        // 接下去以此類推
        if (size < 1024) {
            return String.valueOf(size) + "KB";
        } else {
            size = size / 1024;
        }
        if (size < 1024) {
            // 因爲如果以MB爲單位的話,要保留最後1位小數,
            // 因此,把此數乘以100之後再取餘
            size = size * 100;
            return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "MB";
        } else {
            // 否則如果要以GB爲單位的,先除於1024再作同樣的處理
            size = size * 100 / 1024;
            return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "GB";
        }
    }

}

實體類

public class FileMessage {

    /**
     * 文件名稱
     */
    private String fileName;

    /**
     * 文件路徑
     */
    private String fileRoute;

    /**
     * 下載地址
     */
    private String fileDownloadUri;

    /**
     * 文件類型
     */
    private String fileType;

    /**
     * 文件大小
     */
    private String size;
}

下載

@RestController
public class FileDownload {

    @Value("${commonfile}")
    private String commonfile;

    @GetMapping("/download")
    public String downloadFile(FileMessage fileMessage) throws UnsupportedEncodingException {
        // 獲取HttpServletResponse
        HttpServletResponse response =
            ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
        String fileName = fileMessage.getFileName();// 文件名
        if (fileName != null) {
            // 設置文件路徑
            File file = new File(commonfile + fileName);
            if (file.exists()) {
                RequestAttributes requsetAttributes = RequestContextHolder.currentRequestAttributes();
                HttpServletRequest request = ((ServletRequestAttributes)requsetAttributes).getRequest();
                // 獲得瀏覽器代理信息
                final String userAgent = request.getHeader("USER-AGENT");
                // 判斷瀏覽器代理並分別設置響應給瀏覽器的編碼格式
                if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
                    // IE瀏覽器
                    fileName = URLEncoder.encode(fileName, "UTF-8");
                } else if (StringUtils.contains(userAgent, "Mozilla")) {
                    // google,火狐瀏覽器
                    fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
                } else {
                    // 其他瀏覽器
                    fileName = URLEncoder.encode(fileName, "UTF-8");// 其他瀏覽器
                }
                // 設置HTTP響應頭
                response.reset();
                // 重置 如果不在頁面上顯示而是下載下來 則放開註釋
                // response.setContentType("application/octet-stream");// 告知瀏覽器下載文件,而不是直接打開,瀏覽器默認爲打開
                // response.addHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");// 下載文件的名稱
 
                try {
                    
                    OutputStream os = response.getOutputStream();
                    // 讀取文件
                    InputStream in = new FileInputStream(file);
                    // copy文件
                    IOUtils.copy(in, os);
                    in.close();
                    os.close();
                    return "下載成功";
                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }
        }
        return "下載失敗";
    }
}

 

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