关于下载音乐的问题

博主在项目中遇到通过URL下载云存储上的音乐文件的问题,起初尝试使用URLEncoder.encode()解决中文路径乱码,但导致HTTP 400错误。最终采取的解决方案是将URL分解,只对包含中文的部分进行编码,成功下载了文件。博客内容详细介绍了问题的解决过程和技术细节。
摘要由CSDN通过智能技术生成

        这周写项目遇到了一个问题——怎么通过url下载音乐文件。

        因为之前写下载文件都是通过文件路径去下载的,而这一次我们用到了云存储,在数据库里面存的是url地址,所以我就不知道应该怎么去下载了。后来我在网上找到了通过url来下载文件的方法,但是又遇到了一个问题,就是我是从数据库获取的url,里面有中文会报错,这个问题困扰了我好长时间。

        我在网上查找解决中文乱码的办法的时候,知道了URLEncoder.encode()可以使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式 ,从而解决中文乱码。但是我在使用了URLEncoder.encode()之后,发现接口报错HTTP response code: 400 for URL,显示发送了异常请求,后来才发现并不能将url全部进行转化,否者会把HTTP:// 中的斜线也转义,导致请求出现协议异常等问题。

        后来由于我找不到更好的办法对url中的中文进行处理,就将url分割成了几部分,然后对含有中文的那一部分进行转化。虽然方法有点笨,但是总算是解决了问题。

public ModelAndView download(Integer musicId,  HttpServletResponse response) throws Exception {
        Map map=new HashMap();
        Music music =musicService.queryById(musicId);
        String musicName=music.getMusicName();
        String musicPath=music.getMusicPath();
        ServletOutputStream out = null;
        InputStream inputStream = null;
        String[] str=musicPath.split("/",4);
        String[] s=str[3].split("\\.");
        try {
            //路径
            String path = musicPath;
            System.out.println(path);
            // 取得文件的后缀名。
            String ext = path.substring(path.lastIndexOf(".") + 1).toLowerCase();
            //文件名
            String pdfName = musicName+"."+ext;
            // 获取外部文件流
            URL url = new URL(str[0]+"//"+str[2]+"/"+URLEncoder.encode(s[0], "UTF-8")+"."+s[1]);
            map.put("2",url);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(3 * 1000);
            //防止屏蔽程序抓取而返回403错误
            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            inputStream = conn.getInputStream();
            /**
             * 输出文件到浏览器
             */
            int len = 0;
            // 输出 下载的响应头,如果下载的文件是中文名,文件名需要经过url编码
            response.setContentType("application/x-download");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(pdfName, "UTF-8"));
            response.setHeader("Cache-Control", "no-cache");
            out = response.getOutputStream();
            byte[] buffer = new byte[1024];
            while ((len = inputStream.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (Exception e) {
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                }
            }
        }
        return new ModelAndView();
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值