本文共 3297 字,大约阅读时间需要 10 分钟。
文件的上传下载
在一个Web
工程中,要实现文件的上传,首先要把表单上传数据的编码方式设置为二进制数据格式,这要用到表单的enctype
属性,此属性一般有三个值。 1.1 application/x-www-form-urlencoded
:这是默认值,适用范围最广泛。但在向服务器发送大量的文本、包含非ASCII
字符的文本或二进制数据时,这种编码方式效率很低。 1.2 multipart/form-data
:上传二进制数据,只有使用了multipart/form-data
才能完整上传数据,完成上传功能。 1.3 text/plain
:主要用于电子邮件的应用。 一般实际应用中多设置enctype
属性值为multipart/form-data
,这样在服务器中得到的上传数据才能以二进制传递。然后设置一个输入流,得到页面上传来的文件信息,再用一个输出流将这个文件写入服务器的内存中。部分代码改自三扬科技,开发者突击:Struts2
核心技术与JavaEE
框架整合开发实战一书。 FileAction.java 实现功能的代码段: // 用列表封装上传文件的三个属性 , 若只上传一个文件的情况,可以不用列表。 private List<File> upload ; private List<String> uploadContentType ; private List<String> uploadFileName ; // savePath,fileName 为数据库中的对应项 private String savePath ; private String fileName ; public String addSave() throws Exception { System. out .println( "-------fileaddsave" ); List<File> files = getUpload(); String path = "D:/project/file/" ; // 判断文件夹是否存在,不存在,则创建一个新文件夹 File[] flist = f.listFiles(); for ( int i = 0; i < flist. length ; i++) { // 用一个 for 循环把 files 中的所有文件取出来逐一上传 for ( int i = 0; i < files.size(); i++) { // 以上传文件存放路径和原文件名建立一个输出流 path+ System.currentTimeMillis()+ // fileName.substring(fileName.lastIndexOf("."),fileName.length()) String filename = getUploadFileName().get(i); System. out .println(filename); getRequest().getSession().setAttribute( "fileName" , filename); if (filename.indexOf( "/" ) == -1) { fos = new FileOutputStream(path + filename); } else { // if explore is firefox String fileNAME = filename.substring(filename .lastIndexOf( "/" ), filename.length()); fos = new FileOutputStream(path + fileNAME); System. out .println(getUploadFileName().get(i)); FileInputStream fis = new FileInputStream((File) files.get(i)); byte [] buffer = new byte [1024]; while ((len = fis.read(buffer)) > 0) { fos.write(buffer, 0, len); String fileName = (String) getRequest().getSession().getAttribute( file .setFileName(fileName); fileDAO .attachDirty( file ); public String download() throws Exception { Integer id = (Integer) getRequest().getSession().getAttribute( "id" ); file = (File) fileDAO .findByProperty( "id" , id) String path = file .getSavePath(); String name = file .getFileName(); getResponse().setContentType( "application/octec-stream" ); + new String(name.getBytes(), "ISO-8859-1" )); OutputStream outputStream = getResponse().getOutputStream(); InputStream inputStream = new FileInputStream(path); byte [] buffer = new byte [1024]; while ((i = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, i); 本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/163457,如需转载请自行联系原作者