以流的方式对文件上传下载,并保存指定位置

本文介绍了一个使用Java实现的文件上传和下载功能,包括文件的处理、上传至服务器、下载至客户端的过程。文章详细展示了如何使用MultipartFile进行文件上传,如何在服务器端保存文件,以及如何通过HTTP响应将文件下载到客户端。

本方法是将文件以流的方式,下载到指定的路径。

1.java代码

@Controller
public class FileController {

    @RequestMapping(value = "/fileuploads")
    public String toFileUpload() {
        return "fileupload";
    }

    @RequestMapping(value = "/fileupload")
    public String fileUpload(@RequestParam(value = "file") List<MultipartFile> files, HttpServletRequest request) {
        String msg = "";
        // 判断文件是否上传
        if (!files.isEmpty()) {
            // 设置上传文件的保存目录
            String basePath = request.getServletContext().getRealPath("/upload/");
            // 判断文件目录是否存在
            File uploadFile = new File(basePath);
            if (!uploadFile.exists()) {
                uploadFile.mkdirs();
            }
            for (MultipartFile file : files) {
                String originalFilename = file.getOriginalFilename();
                if (originalFilename != null && !originalFilename.equals("")) {
                    try {
                        // 对文件名做加UUID值处理
                        originalFilename = UUID.randomUUID() + "_" + originalFilename;
                        file.transferTo(new File(basePath + originalFilename));
                    } catch (IOException e) {
                        e.printStackTrace();
                        msg = "文件上传失败!";
                    }
                } else {
                    msg = "上传的文件为空!";
                }
            }
            msg = "文件上传成功!";
        } else {
            msg = "没有文件被上传!";
        }
        request.setAttribute("msg", msg);
        return "chatroom";
    }

    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public String handException(MaxUploadSizeExceededException e, HttpServletRequest request) {
//        System.out.println("我捕获了异常");
        request.setAttribute("msg", "文件超过了指定大小,上传失败!");
        return "fileupload";
    }


    @RequestMapping(value = "/filedownload")
    public String toFileDownload(HttpServletRequest request) {
        return "filedownload";
    }

    @RequestMapping(value = "/fileList")
    @ResponseBody
    public String fileList(HttpServletRequest request) {
        String baseDir = request.getServletContext().getRealPath("/upload");
        File baseFile = new File(baseDir);
        List<String> fileList = null;
        if (baseFile.exists()) {
            File[] files = baseFile.listFiles();
            fileList = new ArrayList<>(files.length);
            for (File file : files) {
                fileList.add(file.getName());
            }
        }
//        System.out.println(fileList.toString());
        String json = JSON.toJSONString(fileList);
        return json;
    }


    @RequestMapping(value = "/download")
    public ResponseEntity<byte[]> fileDownload(String filename, HttpServletRequest request) throws IOException {
        String path = request.getServletContext().getRealPath("/upload/");
        File file = new File(path + filename);
        System.out.println("转码前" + filename);
        filename = this.getFilename(request, filename);
        System.out.println("转码后" + filename);
        // 设置响应头通知浏览器下载
        HttpHeaders headers = new HttpHeaders();
        // 将对文件做的特殊处理还原
        filename = filename.substring(filename.indexOf("_") + 1);
        headers.setContentDispositionFormData("attachment", filename);
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
    }

    // 根据不同的浏览器进行编码设置,返回编码后的文件名
    public String getFilename(HttpServletRequest request, String filename) throws UnsupportedEncodingException {
        String[] IEBrowerKeyWords = {"MSIE", "Trident", "Edge"};
        String userAgent = request.getHeader("User-Agent");
        for (String keyword : IEBrowerKeyWords) {
            if (userAgent.contains(keyword)) {
                return URLEncoder.encode(filename, "UTF-8");
            }
        }
        return new String(filename.getBytes("UTF-8"), "ISO-8859-1");
    }


}
$(function(){
		var targer = $("#main2")
		$.ajax({
			url: "fileList",
			dataType: "json",
			success: function (data) {
				for (var i in data) {
					var a = $("<a></a><br>").text(data[i].substring(data[i].indexOf("_")+1))
					a.attr("href", "${pageContext.request.contextPath}/download?filename="+encodeURIComponent(data[i]))
					targer.append(a)
					alert(targer)
				}
			}
		})
	}

2.js代码 

function check() {
		var file = document.getElementById("file");
		if (file.value == "") {
			alert("上传的文件为空")
			return false;
		}
		return true;
	}

3.jsp代码

<div id="main" style="width:500px; margin: 0 auto;">
				<form action="fileupload" method="post" enctype="multipart/form-data" onsubmit="return check()">
					<input type="file" name="file" id="file" multiple="multiple"><br>
					<input type="submit" value="上传">
				</form>
			</div>

			<div id="main2" style="width:500px; margin: 0 auto;">

			</div>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鲍侃java

请博主喝个可乐吧,可加微信面基

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值