文件上传和下载

各种配置文件已经在上一篇博文中说过了,这次实例就直接贴文件上传的方法了.

多文件上传案例(单文件上传去掉循环即可)

@RequestMapping("/uploads.do")
	public String uploads(@RequestParam(value="file",required=false)MultipartFile[] files,HttpServletRequest request){
		for (MultipartFile file : files) {
			//要保存的地址,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
			String savePath=request.getServletContext().getRealPath("/WEB-INF/upload");
			//如果没有保存文件的目录,就创建该目录
			File saveDir=new File(savePath);
			if(!saveDir.exists() && !saveDir.isDirectory()){
				saveDir.mkdir();
			}
			//获取上传文件的名称
			String uploadFileName=file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf('.'));
			//获取上传文件的扩展名
			String fileExtName=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
			//设置上传后文件的名称,UUID保证上传文件名唯一
			String saveFilename=uploadFileName+"_"+UUID.randomUUID()+fileExtName;
			//得到文件的保存目录
			String realSavePath = makePath(saveFilename, savePath);
			//打印保存地址,方便上传文件后查看
			System.out.println(realSavePath);
			//要被输入的文件
			File targetFile=new File(realSavePath,saveFilename);
			try{
			    //将文件保存在目录
			    file.transferTo(targetFile);
			}catch(Exception e){
			    e.printStackTrace();
			}
		}
		request.setAttribute("message", "文件上传成功!");
		return "result";
	}
	
	//为防止一个目录下面出现太多文件,要使用hash算法打散存储
	private String makePath(String filename,String savePath){
		//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
		int hashcode = filename.hashCode();
		int dir1 = hashcode&0xf;  //0--15
		int dir2 = (hashcode&0xf0)>>4;  //0-15
		//构造新的保存目录
		String dir = savePath + "\\" + dir1 + "\\" + dir2;  //upload\2\3  upload\3\5
		//File既可以代表文件也可以代表目录
		File file = new File(dir);
		//如果目录不存在
		if(!file.exists()){
		    //创建目录
		    file.mkdirs();
		}
		    return dir;
	 }

文件下载

@RequestMapping("/download.do")
	public ResponseEntity<byte[]> download(HttpServletRequest request,String filename) throws IOException{
		//下载文件路径
        String path = request.getServletContext().getRealPath("/images/");
        File file = new File(path + File.separator + filename);
        HttpHeaders headers = new HttpHeaders();  
        //下载显示的文件名,解决中文名称乱码问题  
        String downloadFielName = new String(filename.getBytes("UTF-8"),"iso-8859-1");
        //通知浏览器以attachment(下载方式)打开图片
        headers.setContentDispositionFormData("attachment", downloadFielName); 
        //application/octet-stream : 二进制流数据(最常见的文件下载)。
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),    
                headers, HttpStatus.CREATED);
	}

 第二种文件下载

package cn.dyw.generatesql.utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;

public class DownloadUtil {

	public static String encoding = "UTF-8";
	
	/**
	 * 下载
	 * @param request
	 * @param response
	 * @throws Exception
	 */
	public static void downLoad(String path,HttpServletRequest request,HttpServletResponse response) throws Exception{
	    File file = new File(path);
		if( file.exists() ){
				String fileName = file.getName();
		    	String userAgent = request.getHeader("User-Agent"); 
		    	
		    	//针对IE或者以IE为内核的浏览器:
		    	if (userAgent.contains("MSIE")||userAgent.contains("Trident")) {
		    		fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
		    	} 
		    	else {
		    		//非IE浏览器的处理:
		    		fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
		    	}
				response.setHeader("Content-Disposition", "attachment;filename=" + fileName );  
			    response.setContentType("application/OCTET-STREAM;charset=UTF-8");
		        response.setCharacterEncoding("UTF-8");
		    	 try {
					FileInputStream fis = new FileInputStream(file);
					OutputStream fos = response.getOutputStream();
					byte[] buffer = new byte[1024*1024*1];
					int len = 0;
					while((len=fis.read(buffer)) !=-1){
						fos.write(buffer, 0, len);
					}
					fis.close();
					fos.flush();
					fos.close();
				} catch (Exception e) {
					e.printStackTrace();
			    	throw new Exception(e.getMessage(),e);
				} 
		    }
		else{
	    	throw new Exception("文件不存在!![path:"+ file.getAbsolutePath() +"]" );
	    }
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中实现HTTP协议的文件上传下载可以使用Qt Network模块提供的QNetworkAccessManager类来实现。对于大文件的上传和下载,通常需要考虑以下几个问题: 1. 分块上传/下载:将大文件分成多个小块,分别上传/下载,可以提高传输速度,同时也能够避免一次性传输过程中出现内存不足等问题。 2. 断点续传:上传/下载过程中,如果网络中断或者其他原因导致传输中断,可以通过断点续传机制重新开始传输,避免重新传输整个文件。 3. 进度条显示:上传/下载大文件需要一定的时间,为了让用户了解传输进度,需要在界面上显示传输进度条。 以下是大文件上传下载的基本步骤: 1. 创建QNetworkAccessManager对象,并连接信号finished()和uploadProgress()/downloadProgress()等信号以获取上传/下载进度。 2. 调用QNetworkAccessManager的post()或get()方法,传入要上传/下载的文件的URL,并设置请求头部信息(如Content-Length等)。 3. 将要上传/下载的大文件分成多个小块,分别上传/下载。在上传/下载过程中,可以设置QIODevice::Unbuffered标志以减少内存占用。 4. 实现断点续传机制。如果上传/下载过程中出现中断,记录当前已传输的字节数,下次从该位置开始继续传输。 5. 在界面上显示上传/下载进度条。可以通过计算当前已传输的字节数和总字节数的比例来计算进度百分比,并更新进度条显示。 以下是相关问题:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值