文件下载:
jsp:
<input type="button" value="歌曲下载" οnclick="location.href='downFile.do'">
java:
public class downFile implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
download("C:\\Users\\ankreran\\Videos\\1.txt",response);
return null;
}
public HttpServletResponse download(String path, HttpServletResponse response) {
try {
// path是指欲下载的文件的路径。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return response;
}
}
其中response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。
例如web浏览器就是通过MIME类型来判断文件是GIF图片。Tomcat的安装目录\conf\web.xml 中就定义了大量MIME类型 ,可以参考。
response.setContentType("text/html; charset=utf-8"); html
.setContentType("text/plain; charset=utf-8"); 文本
text/javascript json数据
application/xml xml数据
常用的MIME类型还有image/gif(GIF图片)、image/bitmap(BMP图象)、text/plain(文本文档TXT)、text/vnd.wap.wml(手机WAP页面)等
response.setContentType("application/octet-stream"); 把响应设置为二进制流,任何类型的都可以设置成这个MIME型。
做用表单上传文件,想在服务端验证上传文件的类型,只允许上传GIF,JPG,ZIP, 我们有两种方法:
第一:检查文件的扩展名;
第二:检查文件的MIME类型 。检查文件的扩展名的方法,很简单快捷, 但是 a.jsp 改名为 a.jpg能可以绕过检查上传了。 检查文件的MIME类型的方法,在IE7与Firefox下有一点区别(见下表), 有不同浏览器上传表现不一致。
文件上传:(图片存本地,抽图并上传到云存储上)
实例:GroupController.java
@RequestMapping(value="/uploadImage.do") //图片落本地,抽图,上传到云存储
public @ResponseBody
String uploadImage(HttpServletRequest request, HttpServletResponse response){
Map<String, Object> model = new HashMap<String, Object>();
try {
MultipartHttpServletRequest mpr = (MultipartHttpServletRequest) request;
MultipartFile mpf = mpr.getFile(MULTIPARTFILE_NAME); // 文件input标签的name值
//这里使用request.getInputStrtam()是不可以的
if (mpf.getSize() > maxFileSize) { //文件是否超出大小
return ReturnMessageUtil.createErrorMsg("上传图片失败,图片大小不能超过2M!");
}
String fileName = mpf.getOriginalFilename();//文件名,包括扩展名
String originalFileType = PhotoUtil.getExtension(fileName); //获取上传文件类型
// 得到一个可用的文件名,并设置各个尺寸缩略图的存储文件名
String mainStoreFile = photoCloudStorage.getNextFileName();
//设置文件名
String fileNameO = photoCloudStorage.getTempPath() + mainStoreFile + "_O" + originalFileType; //如b5be1cbe30b34c5e9fa56107d396a7ef_O.jpg
String fileNameB = photoCloudStorage.getTempPath() + mainStoreFile + "_B" + originalFileType;
String fileNameM = photoCloudStorage.getTempPath() + mainStoreFile + "_M" + originalFileType;
String fileNameS = photoCloudStorage.getTempPath() + mainStoreFile + "_S" + originalFileType;
//先上传到本地,产生临时文件
File fileOriginalImage = new File(fileNameO);
mpf.transferTo(fileOriginalImage);
//开始抽图,会读取抽图软件执行命令,这里会生成3张图
imageConvertor.fill(fileNameO, fileNameB, imageSizeBig);
imageConvertor.fill(fileNameO, fileNameM, imageSizeMiddle);
imageConvertor.fill(fileNameO, fileNameS, imageSizeSmall);
//上传到云存储
String storeFileO = photoCloudStorage.upload(fileNameO);
String storeFileB = photoCloudStorage.upload(fileNameB);
String storeFileM = photoCloudStorage.upload(fileNameM);
String storeFileS = photoCloudStorage.upload(fileNameS);
model.put("storeFileO", storeFileO);
model.put("storeFileB", storeFileB);
model.put("storeFileM", storeFileM);
model.put("storeFileS", storeFileS);
JSONObject json = JSONObject.fromObject(model);
//上传完后,删除服务器临时文件
File file = new File(fileNameO);
if(file.exists()){
file.delete();
}
file = new File(fileNameB);
if(file.exists()){
file.delete();
}
file = new File(fileNameM);
if(file.exists()){
file.delete();
}
file = new File(fileNameS);
if(file.exists()){
file.delete();
}
file = new File(fileNameO);
if(file.exists()){
file.delete();
}
return ReturnMessageUtil.createOKMsg(json);
} catch (Exception e) {
e.printStackTrace();
return ReturnMessageUtil.createErrorMsg("上传图片失败!");
}
}
ps: 如果想获得上传图片的高度和宽度,可以用如下方法:
File picture = new File("C:/Users/Administrator/Pictures/我的图片/neusoft.png");
BufferedImage sourceImg =ImageIO.read(new FileInputStream(picture));
System.out.println(String.format("%.1f",picture.length()/1024.0));
System.out.println(sourceImg.getWidth());
System.out.println(sourceImg.getHeight());
jsp端:
<form action="group/uploadImage.do" method="post" id="wsn" name="wsn" enctype="multipart/form-data">
<input name="mpf" type="file" value=""/>
<input type="submit" value="提交">
</form>
ps:如果想要用户只能下载不能打开文件的话,可以设置以下三行代码:
response.setHeader("content-disposition", "attachment;filename="
+ stroeFile);
// 设置response的编码方式
response.setContentType("application/x-msdownload");
// 解决中文乱码
response.setHeader("Content-Disposition", "attachment;filename="+ new String(stroeFile.getBytes("UTF-8"), "iso-8859-1"));