linux系统下运行的java web项目下载远程文件,下载完成后提示文件已损坏

码上中国博客 发布于 2018/01/08 19:09
阅读 1K+
收藏 0

部分代码如下:

  /**
	 * 从网络Url中下载文件
	 * @param urlStr   下载的URL
	 * @param fileName  新文件名称
	 * @param savePath   保存的路径,不包含文件名称
	 * @throws IOException
	 */
	public static void  downLoadFromUrl(String urlStr,String fileName,String savePath) throws IOException{
		
		logger.info("-----------------------downLoadFromUrl old URL is :\n"+urlStr);
		String downloadUrl = urlStr;
		logger.info("-----------------------downLoadFromUrl new URL is :\n"+downloadUrl);
		
		logger.info("-----------------------save dir is :\t"+savePath+", file name is :\t"+fileName);
		
//		downloadUrl = urlStr;
		
		URL url = new URL(downloadUrl);
		HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
                //设置超时间为10秒
		conn.setConnectTimeout(10*1000);
		//防止屏蔽程序抓取而返回403错误
		conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

		//得到输入流
		InputStream inputStream = conn.getInputStream();  
		//获取自己数组
		byte[] getData = readInputStream(inputStream);    

		//文件保存位置
		File saveDir = new File(savePath);
		if(!saveDir.exists()){
			saveDir.mkdir();
		}
		logger.info("-----------------------------下载的文件保存位置为:"+saveDir+File.separator+fileName);
		File file = new File(saveDir+File.separator+fileName);    
		FileOutputStream fos = new FileOutputStream(file);     
		fos.write(getData); 
		if(fos!=null){
			fos.close();  
		}
		if(inputStream!=null){
			inputStream.close();
		}

		logger.info("-----------------------downLoadFromUrl: "+url+" download success"); 

	}

 

测试方法:

	public static void main(String[] args) {
		try{
			downLoadFromUrl("http://101.95.48.97:8005/res/upload/interface/apptutorials/manualstypeico/6f83ce8f-0da5-49b3-bac8-fd5fc67d2725.zip",
					"a.zip","d:/resource/images/diaodiao/country/");
		}catch (Exception e) {
			// TODO: handle exception
		}
	}

我使用上面的代码下载一个压缩文件,但是在linux下下载成功后,手动双击打开此文件,却提示文件损坏,windows下运行此代码就没问题,请问这是什么原因?

 

 

 

加载中
1
李索锐

清空流再关闭

0
纯洁徐
纯洁徐

该目录是否有授权?

码上中国博客
码上中国博客
确认了下,授权777后,代码中下载文件成功,然后拖拽下载,双击打开仍旧提示文件已损坏。
0
Amaniy
Amaniy

给个权限试试 777

0
码上中国博客
码上中国博客

引用来自“Amaniy”的评论

给个权限试试 777

确认了下,授权777后,代码中下载文件成功,然后拖拽下载,双击打开仍旧提示文件已损坏。

Amaniy
Amaniy
那就是你下载的方法写的有问题,估计缺失了一部分
0
趴一会
趴一会

你这代码不全  byte[] getData = readInputStream(inputStream);

没有看到你的这个方法 readInputStream

0
码上中国博客
码上中国博客

引用来自“趴一会”的评论

你这代码不全  byte[] getData = readInputStream(inputStream);

没有看到你的这个方法 readInputStream

	/**
	 * 从输入流中获取字节数组
	 * @param inputStream
	 * @return
	 * @throws IOException
	 */
	public static  byte[] readInputStream(InputStream inputStream) throws IOException {  
		byte[] buffer = new byte[1024];  
		int len = 0;  
		ByteArrayOutputStream bos = new ByteArrayOutputStream();  
		while((len = inputStream.read(buffer)) != -1) {  
			bos.write(buffer, 0, len);  
		}  
		bos.close();  
		return bos.toByteArray();  
	}  

	public static void main(String[] args) {
		try{
			downLoadFromUrl("http://101.95.48.97:8005/res/upload/interface/apptutorials/manualstypeico/6f83ce8f-0da5-49b3-bac8-fd5fc67d2725.png",
					"百度.jpg","d:/resource/images/diaodiao/country/");
		}catch (Exception e) {
			// TODO: handle exception
		}
	}

 

0
趴一会
趴一会

问题很简单.
你下载的时png图片,但是你保存的后缀为jpg.
在windows下可以兼容这种情况,而Linux默认的图片浏览软件很可能是根据文件后缀识别的.
把文件名更改成百度.png 就没问题了

0
开源中国首席弟子
开源中国首席弟子

有些文件比较大时,传输会压缩,下载到本地打开会显示损坏,用GZIPInputStream 。要么把gzip关闭

开源中国首席弟子
开源中国首席弟子
直接把压缩流写成文件肯定有问题
返回顶部
顶部