在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、文件上传 复制代码 代码如下: <form action="file?file=upload" method="post" enctype="multipart/form-data"> 请选择你要上传的文件:<input type="file" name="upload" siez="16"><br> <input type="submit" value="提交"> </form> 对于文件上传表单处理其中method必须为post,也要增加类型enctype="multipart/form-data"。这样就可以把文件中的数据作为流式数据上传。当然无论是什么文件格式,均可以。。。 复制代码 代码如下: //接收上传文件内容中临时文件的文件名 String tempFileName = new String("tempFileName"); //tempfile 对象指向临时文件 File tempFile = new File("D:/"+tempFileName); //outputfile 文件输出流指向这个临时文件 FileOutputStream outputStream = new FileOutputStream(tempFile); //得到客服端提交的所有数据 InputStream fileSourcel = request.getInputStream(); //将得到的客服端数据写入临时文件 byte b[] = new byte[1000]; int n ; while ((n=fileSourcel.read(b))!=-1){ outputStream.write(b,0,n); } //关闭输出流和输入流 outputStream.close(); fileSourcel.close(); //randomFile对象指向临时文件 RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r"); //读取临时文件的第一行数据 randomFile.readLine(); //读取临时文件的第二行数据,这行数据中包含了文件的路径和文件名 String filePath = randomFile.readLine(); //得到文件名 int position = filePath.lastIndexOf('\\'); CodeToString codeToString = new CodeToString(); String filename = codeToString.codeString(filePath.substring(position,filePath.length()-1)); //重新定位读取文件指针到文件头 randomFile.seek(0); //得到第四行回车符的位置,这是上传文件数据的开始位置 long forthEnterPosition = 0; int forth = 1; while((n=randomFile.readByte())!=-1&&(forth<=4)){ if(n=='\n'){ forthEnterPosition = randomFile.getFilePointer(); forth++; } } //生成上传文件的目录 File fileupLoad = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file","upLoad"); fileupLoad.mkdir(); //saveFile 对象指向要保存的文件 File saveFile = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename); RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw"); //找到上传文件数据的结束位置,即倒数第四行 randomFile.seek(randomFile.length()); long endPosition = randomFile.getFilePointer(); int j = 1; while((endPosition>=0)&&(j<=4)){ endPosition--; randomFile.seek(endPosition); if(randomFile.readByte()=='\n'){ j++; } } //从上传文件数据的开始位置到结束位置,把数据写入到要保存的文件中 randomFile.seek(forthEnterPosition); long startPoint = randomFile.getFilePointer(); while(startPoint<endPosition){ randomAccessFile.write(randomFile.readByte()); startPoint = randomFile.getFilePointer(); } //关闭文件输入、输出 randomAccessFile.close(); randomFile.close(); tempFile.delete(); 其中CodeToString()方法是一个中文字符处理的方法。如果文件不进行编码转换,则上传后的文件名将会是乱码,接收的文件数据也会是乱码: 复制代码 代码如下: //处理中文字符串的函数 public String codeString(String str){ String s = str; try { byte[] temp = s.getBytes("utf-8"); s = new String(temp); return s ; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return s; } } 二:文件下载 复制代码 代码如下: //获取要下载的文件名 String filename = request.getParameter("name"); //得到想客服端输出的输出流 OutputStream outputStream = response.getOutputStream(); //输出文件用的字节数组,每次向输出流发送600个字节 byte b[] = new byte[600]; //要下载的文件 File fileload = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename); //客服端使用保存文件的对话框 response.setHeader("Content-disposition", "attachment;filename="+filename); //通知客服文件的MIME类型 response.setContentType("application/msword"); //通知客服文件的长度 long fileLength = fileload.length(); String length = String.valueOf(fileLength); response.setHeader("Content_length", length); //读取文件,并发送给客服端下载 FileInputStream inputStream = new FileInputStream(fileload); int n = 0; while((n=inputStream.read(b))!=-1){ outputStream.write(b,0,n); } 在该程序中,response对象的setContentType()用来定义服务器发送给客服端内容的MIME类型。这里对MIME就不特别介绍了。事实上,凡是浏览器能处理的所有资源都有对应的MIME资源类型。在与服务器的交互中,浏览器就是对html、jsp等文件浏览器直接将其打开。对于word、excel等浏览器自身不能打开的文件则调用相应的方法。对于没有标记MIME类型的文件。浏览器则根据其扩展名和文件内容猜测其类型。。。 |
请发表评论