JSP界面读取文件后拿到后台进行操作后弹出下载

该博客介绍了如何在Java后台对文件内容进行处理,通过数字和字母筛选,进行编码加密。然后利用URLEncoder编码解决中文文件名问题,最终实现文件的下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

后台代码如下:

@SuppressWarnings({ "finally", "unchecked", "null", "rawtypes" })
@RequestMapping(value = "/jhxz", produces = "application/json")
private List jhxz(HttpServletRequest request, HttpServletResponse response) throws Exception {
	
	Map map = new HashMap();
	FileItemFactory factory = new DiskFileItemFactory();
	ServletFileUpload upload = new ServletFileUpload(factory);
	upload.setHeaderEncoding("UTF-8");
	File fil=null;
	List<FileItem> items = null;
	try {
		items = upload.parseRequest(request); // 获得前台提交过来的信息,两类:文件、form表单

	} catch (FileUploadException e) {
		e.printStackTrace();
	}
	File file = new File("D://2.dat");
	if (!Util.isNullOrEmpty(items)) {
		Iterator<FileItem> itr = items.iterator();
		while (itr.hasNext()) {
			FileItem item = (FileItem) itr.next();
			if (item.isFormField()) {//将前台拿到的文件进行处理保存到文帝
				// 是表单数据
				map.put(item.getFieldName(), item.getString("utf-8"));
			} else if (!"".equals(item.getName())) {// 不是form表单数据而是文件上传
				fil = new File(item.getName());
				map.put("name", fil.getName());
				item.write(file);
			}
		}
	
	}
	//读取上传文件
	BufferedReader br = null;
    StringBuffer sb = new StringBuffer();
    try {
        br = new BufferedReader(new FileReader(file));
        String line = null;
        while((line = br.readLine())!=null){
            sb.append(line);                
        }
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }finally{
        try {
            if(br!=null){
                br.close();
            }
        } catch (Exception e2) {
            // TODO: handle exception
            e2.printStackTrace();
        }
    }
    fil.delete();
   // System.out.println(sb.toString());

//对文件进行处理(这块可以不看)

String sbb=sb.toString();
String q1="";
for(int i=0 ; i<sbb.length();i++){
if(Character.isDigit(sbb.charAt(i))){ //用char包装类中的判断数字的方法判断每一个字符
q1=q1+sbb.charAt(i);
}
if(Character.isLetter(sbb.charAt(i))){ //用char包装类中的判断字母的方法判断每一个字符
q1=q1+sbb.charAt(i);
}

}
String s1=q1;
String s15=(String) s1.subSequence(0, 15);
String s2425=(String)s1.subSequence(23,25);
String s1728=(String)s1.subSequence(15,28);
String s28=(String)s1.subSequence(27,28);
String s2930=(String)s1.subSequence(28,30);
String total=s15+s2425+s1728+s28+s2930+“20991201”;
final BASE64Encoder encoder = new BASE64Encoder();
final byte[] textByte = total.getBytes(“UTF-8”);
//编码加密
final String encodedText = encoder.encode(textByte);
//System.out.println(encodedText);
String head=“0001000000FFFFFFFF0100000000000000060100000038”;
String end =“0B”;
String str = “”;
for (int i = 0; i < encodedText.length(); i++) {
int ch = (int) encodedText.charAt(i);
String s4 = Integer.toHexString(ch);
str = str + s4;
}
str = head + str + end;
str = str.toUpperCase();

//下载文件

//将修改的文件重新写到本地,在进行读取

ServletOutputStream sos = response.getOutputStream();
            //设置客户端下载
            response.setHeader("content-disposition", "attachment;filename=1.dat");
    File f = new File("D:\\1.dat");
	if (!f.exists()) {
		f.createNewFile();
	}
	FileOutputStream fout = new FileOutputStream(f);
	for (int i = 0; i < str.length(); i = i + 2) {
		fout.write(Integer.parseInt(str.substring(i, i + 2), 16));
	}
	fout.close();
	FileInputStream fis = new FileInputStream("D:\\1.dat");
    //将图片写出到网络
    ServletOutputStream sos1 = response.getOutputStream();
    byte[] arr = new byte[1024];
    int num = -1;
    while((num = fis.read(arr)) != -1){
        sos1.write(arr, 0, num);
        sos1.flush();
    }

    fis.close();
    sos1.close();
    f.delete();
return null;
}

参考地址:https://blog.youkuaiyun.com/z1941563559/article/details/80546639
//如果图片的名字是中文的解决办法
//采用encode编码,第一个参数:需要编码的文本,第二个参数:指定的编码
picName = URLEncoder.encode(picName, “utf-8”);

    //将图片读入内存
    FileInputStream fis = new FileInputStream(imgPath);

    //将图片写出到网络
    ServletOutputStream sos = response.getOutputStream();

    //设置客户端下载
    response.setHeader("content-disposition", "attachment;filename="+picName);

    byte[] arr = new byte[1024];

    int num = -1;

    while((num = fis.read(arr)) != -1){
        sos.write(arr, 0, num);
        sos.flush();
    }

    fis.close();
    sos.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值