??xml version="1.0" encoding="utf-8" standalone="yes"?>人人狠狠综合久久亚洲,亚洲最大福利视频网站,久久精品国产亚洲av麻豆蜜芽http://m.tkk7.com/alone/archive/2007/05/11/upload_sample.htmlalonealoneFri, 11 May 2007 10:12:00 GMThttp://m.tkk7.com/alone/archive/2007/05/11/upload_sample.htmlhttp://m.tkk7.com/alone/comments/116831.htmlhttp://m.tkk7.com/alone/archive/2007/05/11/upload_sample.html#Feedback0http://m.tkk7.com/alone/comments/commentRss/116831.htmlhttp://m.tkk7.com/alone/services/trackbacks/116831.html<html>

<head>

<title>ÎļþÉÏÔØ</title>

</head>

<body>

<form action="upjsp.jsp" enctype="MULTIPART/FORM-DATA" method=post>

<br />

¹«Ë¾: <input type="text" name="company" />

<br />

Ñ¡ÔñÒªÉÏÔØµÄÎļþ <input type="file" name="filename" />

<br />

<input type="submit" value="ÉÏÔØ" />

</form>

</body>

</html>
================================END=======================================
<jsp:useBean id="TheBean" scope="page" class="UpBean " />

<%

TheBean.doUpload(request);

%>

================================END=======================================
import java.io.*;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.ServletInputStream;

 

public class UpBean {

 

public void doUpload(HttpServletRequest request) throws

IOException {

PrintWriter pw = new PrintWriter(

new BufferedWriter(new FileWriter("test.txt")));

ServletInputStream in = request.getInputStream();

 

int i = in.read();

while (i != -1) {

pw.print((char) i);

i = in.read();

}

pw.close();

}
}
================================END=======================================



alone 2007-05-11 18:12 发表评论
]]>
Ҏ手机查询归属地的批处理程?/title><link>http://m.tkk7.com/alone/archive/2007/05/11/mobile_area_search.html</link><dc:creator>alone</dc:creator><author>alone</author><pubDate>Fri, 11 May 2007 10:02:00 GMT</pubDate><guid>http://m.tkk7.com/alone/archive/2007/05/11/mobile_area_search.html</guid><wfw:comment>http://m.tkk7.com/alone/comments/116828.html</wfw:comment><comments>http://m.tkk7.com/alone/archive/2007/05/11/mobile_area_search.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/alone/comments/commentRss/116828.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/alone/services/trackbacks/116828.html</trackback:ping><description><![CDATA[<p>import java.sql.*;<br>import java.io.*;<br>import java.util.logging.Logger;<br>class Mobile_area<br>{<br> public static void main(String[] args)<br> {<br>     try<br>  {<br>  String address = "jdbc:odbc:mobile_area";<br>   //驱动cdQ目标数据库ipQ数据库端口<br>   <br>  try {<br>     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");<br>     System.out.println("已经成功q接手机归属地数据库?);} <br>  catch (ClassNotFoundException cnfe) {<br>     System.out.println("q接手机归属地数据库p|Q请参?#8216;readme.txt’文g的描q进行配|!");}<br>  String user="sa";//数据库用户密?br>  String passwd="";//口o<br>  String database = "mobilezip";//目标数据?br>  Logger log = Logger.getLogger("Mobile_area"); <br>  //if (log==null) log= Logger("Mobile_area","mobile_area.log");<br>  Connection con = DriverManager.getConnection(address,user,passwd);//建立链接<br>  con.setCatalog(database);//定目标数据?br>  Statement smt =con.createStatement();<br>  Statement insert_smt =con.createStatement();<br>  Statement insert_smt_pre =con.createStatement();</p> <p>  String selCode = "";//查询语句<br>  String import_file="mobile.txt";<br>  String mobile_pre="";<br>  String mobile_area="";<br>  String city="";<br>  String privince="";<br>  String mobile_num;<br>  ResultSet res,rs;</p> <p>  System.out.println("提示Q您需要处理的文g必须攑֜应用E序所在的目录中,否则无法处理");<br>  System.out.println("      q度状态的含义Q?'.'代表当前的手机号码已l处理过Q?0'代表成功查找q插入该手机L的归属地信息Q?x'代表处理p|");<br>  System.out.println("h输入需要处理的文g名称:");<br>     DataInputStream inputFilename =<br>      new DataInputStream(<br>        new BufferedInputStream(System.in));<br>     try {<br>  String tmp="";<br>        if((tmp = inputFilename.readLine()).length()>0) import_file =tmp ;<br>        System.out.println("您需要处理的文g名ؓQ?+import_file+",处理卛_q行......");<br>     } catch(IOException e) {<br>        System.out.println("您输入的文g异常Q请查您指定的文件是否当前的目录存在?);<br>     }<br> <br>  System.out.println("如您没有输入需要处理的文gQ默认的处理文g名称?"+import_file);</p> <p>     DataInputStream in =<br>        new DataInputStream(<br>          new BufferedInputStream(<br>            new FileInputStream(import_file)));<br>      String s, s2 = new String();</p> <p>   System.out.println("|手机L\t|手机区段\t|手机区号\t|城市\t|省市|");//输出此条记录的查询结?br>   int i=0;<br>   String insert_sql="";<br>      while((s = in.readLine())!= null)<br>    {   <br>     mobile_num=s;<br>     if(s==null) s="";<br>     if(s.length()>10)<br>       s=s.substring(0,7);<br>     else<br>    s="88888888888";<br>        selCode="SELECT Mobile_area.mobile, Mobile_area.zip, Mobile_area.city, Mobile_area.state FROM Mobile_area WHERE ((Mobile_area.mobile)="+ s +")";<br>           //System.out.println(selCode);<br>     res = smt.executeQuery(selCode);//l果?br>           if(res.next()) <br>          {    //从第一条往后依ơ取l果集中的记?/p> <p>                mobile_pre =  res.getString(1);//{同rs.getString("userId")Q即W一个字D|?br>                mobile_area = res.getString(2);//同上Q第二个字段Q全部取其ؓStringcd<br>                city =  res.getString(3);//{同rs.getString("userId")Q即W一个字D|?br>                privince = res.getString(4);//同上Q第二个字段Q全部取其ؓStringcd<br>                //若是中文字段Q一般需要{?br>                //userName = new String(userName.getBytes("ISO-8859-1"),"gb2312");<br>                if(i<=100)<br>                System.out.println("|"+mobile_num+"\t|"+mobile_pre+"\t|"+mobile_area+"\t|"+city+"\t|"+privince+"|");//输出此条记录的查询结?br>    //log.info("|"+mobile_num+"\t|"+mobile_pre+"\t|"+mobile_area+"\t|"+city+"\t|"+privince+"|") ;</p> <p>    String insert_sql_pre="select count(mobile_num)  from mobile_area_insert where mobile_num='"+mobile_num+"'";<br>                rs=insert_smt_pre.executeQuery(insert_sql_pre);<br>    int rcount=0;<br>    if(rs.next()){<br>                 rcount=rs.getInt(1);}<br>                rs.close();//释放资源<br>    if(rcount==0)<br>    {<br>    insert_sql="insert into mobile_area_insert(mobile_num,mobile,zip,city,state) values('"+mobile_num+"','"+mobile_pre+"','"+mobile_area+"','"+city+"','"+privince+"')";<br>                int j=insert_smt_pre.executeUpdate(insert_sql);<br>    if(i>100)<br>     {<br>      if(j>0) System.out.print("0");<br>      else System.out.print("x");<br>      if(i%50==0) System.out.println(i);<br>     }<br>    }<br>    else <br>    {        if(i>100){<br>          System.out.print(".");<br>       if(i%50==0) System.out.println(i); }<br>    }<br>    i++;<br>             }<br>    res.close();//释放资源<br>       }<br>     <br>  System.out.println("\t" + i +"行已l处理!"); System.out.println("=========================end=========================");//输出此条记录的查询结?br>   in.close();<br>   smt.close();<br>   insert_smt.close();<br>   insert_smt_pre.close();<br>   con.close();<br>  }<br>  catch (Exception e)<br>  {e.printStackTrace();}<br> }<br>}<br></p> <img src ="http://m.tkk7.com/alone/aggbug/116828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/alone/" target="_blank">alone</a> 2007-05-11 18:02 <a href="http://m.tkk7.com/alone/archive/2007/05/11/mobile_area_search.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaBean实现多文件上传的两种Ҏ http://m.tkk7.com/alone/archive/2007/05/11/jsp_upload.htmlalonealoneFri, 11 May 2007 09:55:00 GMThttp://m.tkk7.com/alone/archive/2007/05/11/jsp_upload.htmlhttp://m.tkk7.com/alone/comments/116820.htmlhttp://m.tkk7.com/alone/archive/2007/05/11/jsp_upload.html#Feedback0http://m.tkk7.com/alone/comments/commentRss/116820.htmlhttp://m.tkk7.com/alone/services/trackbacks/116820.html摘要Q本文介l了JavaBean实现多个文g上传的两U方法,分别是用http协议和ftp协议实现。首先讲qChttp协议传送多个文件的基本格式和实C传的详细q程Q之后简单介l了使用ftpclient cdCftp方式的上传,最后对q两U方法进行了比较?/p>

  关键字:JavaBean 、http 、ftp 、ftpclient

  JavaBean是一U基于Java的Y件组件。JSP对于在Web 应用中集成JavaBeanlg提供了完善的支持。这U支持不仅能~短开发时_可以直接利用l测试和可信ȝ已有lgQ避免了重复开发)Q也为JSP应用带来了更多的可׾~性?/p>

  文g的上传功能在ZB/S的开发模式中非常普遍。同其他开发工L比较QJSPҎ件的上传支持q不是很完美Q它既不象ASP那样一定需要用组件来完成Q也不像PHP那样直接提供了文件上载的支持。JSP实现文g上传的实现方式是q样的:使用ServletRequestcȝgetInputStream()Ҏ获得一个客L向服务器发出的数据流Q然后处理这个数据流Q从中分析、得到文件上传中传递到服务器的各个参数和数据,然后其中的文g数据存储Z个文件或插入到数据库中。通常JSP面中不处理文g的上传功能,而是把这些功能放到Servlet 或JavaBean中去实现。用Servlet完成文g上传的例子在一些JSP的相关书c中都有所介绍Q我q里介绍使用JeanBean是如何完成文件上传的。JSP中实现文件的上传可以采用两种方式即采用HTTP协议和FTP协议实现Q二者在传输的原理上存在很大的差异。以下将l合源代码对它们的实现做单介l,怿读者会从中有所收获。以下程序已l调试通过。调试的环境Qwindow 2000 server+Apache +tomcat4.0QJavaBean调试环境QJDK1.4+Editplus?/p>

  在JSP中用JavaBean实现ZWeb的文件上传功能一般需要三U文件结合完成。这三种文g分别是提供界面的HTML面文g、完成调用实C传功能的JavaBean的JSP文g和实现JavaBean的Java的类文g。以下我重点讲q采用HTTP协议和FTP协议实现文g上传功能的JavaBean部分?/p>

  1 采用HTTP协议实现多个文g的上?/p>

  在过ȝHtml中,表单不能实现文g的上传,q多限制了一些网늚功能。RFC1867规范Q即Html中实现基于表单的文g上传Q对表单作出了扩展,增加了一个表单元素〈input typeQfile>。通过使用q个元素Q浏览器会自动生成一个输入框和一个按钮,输入框可供用户填写本地的文g名和路径名,按钮可以让浏览器打开一个文仉择框供用户选择文g。具体的表单实现如下Q?/p>

 

 

 

  当选择了粘贴文件后q接输入本地文件的l对路径Q表单的action属性值是*.jspQ这意味着hQ包括上载的文gQ将发送给*..jsp文g。在q个q程中实际上实CHTTP方式的文件上载。文件从客户端到服务器的上蝲是由HTTP协议的通用|关界面(CGI)支持的。这U上载方式要求浏览器和WEBServer两方面都能够支持Rfc1867。JavaBean 通过ServletRequestcȝgetInputStream()Ҏ获得一个客L向服务器发出的数据流、分析上传的文g格式Q根据分析结果将多个文g依次输出服务器端的目标文件中。本例中的JavaBeande的功能是由testUploadcd体实现。TestUploadcȝ框架如下Q?/p>

public class testUpload
{
public testUpload(){……}
public final void initialize(ServletConfig config) throws ServletException
{ m_application = config.getServletContext(); }
public void upload() throws testUploadException, IOException, ServletException
{………}
private void getDataSection(){………}
private void getDataHeader(){………}
public int save (String destPathName)
throws SmartUploadException, IOException, ServletException
{………}
……
}

  通过initializeQ)Ҏ初始化Servlet的运行环境。用upload()Ҏ获得输入,q分析上传文件的格式Qƈ各个上传文件的属性赋l多个Filecd例处理,q些Filecd例由Filescȝ理。FilecL据各文g的属性调用它的save ()Ҏ多个文件依ơ输出服务器端的目标文g中。其中upload()Ҏ是关键,用于分析http1.1协议传送文件的格式。经q测试,我们得出传输文件的格式Q这对理解upload()Ҏ很有用。例如,上传我的文档 t.txt文g。格式如下:

//文g分隔W?br>-----------------------------7d226137250336
//文g信息?br>Content-Disposition: form-data; name="FILE1"; filename="C:Documents and SettingsAdministrator.TIMBER-4O6B0ZZ0My Documents t.sql"
Content-Type: text/plain
//源文件内?
create table info(
content image null);
//下一个文件的分隔W?br>-----------------------------7d226137250336
Content-Disposition: form-data; name="FILE2"; filename=""
Content-Type: application/octet-stream
-----------------------------7d226137250336

  从以上文件我们可以看出,HTTP协议在上传多个文件时Q是文件全部放到输入流q以一定的分隔W来区分的。实际上upload()Ҏ是要分析上面的文gQ确定分隔符的内宏V各个文件的内容格式、文件的完整路径名称、及其文件的实际数据的始末位|。这里需要说明的一Ҏ分隔W是随机的,它是传输文件的W一个回车符之前的所有字W?/p>

  Upload()Ҏ的实现流E是Q首先将输入文件输出到字节数组m_binArray中,通过下面的代码实现?/p>

m_totalBytes=1024QtotalRead=0Q?br>for(; totalRead < m_totalBytes; totalRead += readBytes)
try
{ m_request.getInputStream();
readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);
}catch(Exception e){ throw new SmartUploadException("Unable to upload.");}

  q里采用了@环中多字节读取方法,以上循环不断地读取数据直到数l填满ؓ止。如果一个文件可以完全得刎ͼ则文件的所有字节也可以全部得到。但是因为网l速度通常比CPU慢得多,所以程序很Ҏ在所有的数据到来之前清I网l缓冲区。实际上Q多字节dҎ在试图从暂时为空但是开攄|络~存取数据时Q该Ҏ会返?Q这表示没有数据存在但网l流没有关闭。这U情况下Q单字节Ҏ阻止运行程序的执行Q所以多字节的行Z于单字节read()Ҏ的行为。接下来分析字节数lm_binArray。首先找到分隔符Q用getDataHeader()Ҏq回文g信息头的|从中定源文件的完整路径名、源文g的扩展名和源文g文g内容格式Q用getDataSection()Ҏq回文g的内Ҏ据,q记录文件数据在字节数组中的h位置。然后生成一个Filecd例,q将文g的完整\径名、源文g的扩展名、源文g文g内容格式和文件的内容数据的v止位|放到Filecd例的属性中。找C一个分隔符Ql重复上q过E,直至分析完毕?/p>

  2 采用FTP协议实现多个文g的上?/p>

  FTP协议是Internet上用来传送文件的协议Q规定了Internet上文件互怼送的标准。在java中实现这一功能是借助FtpClientcd成的。具体实现过E:首先与FTP服务器徏立连接;初始化文件的传输方式Q包括ASCII和BINARY两种方式Q将文g输出到文件输入流FileInputStream中;FileInputStream中的数据d字节数组中;字节数组中的数据写入输出TelnetOutputStreamQ利用writeҎ数据写入到一个网l链接上Q。这样和源文件同名的一个文件就复制C服务器端。本例的JavaBean中通过connectServer()、upload()和closeConnect()三个Ҏ完成文g上传q程。主要实现如下:

public class ftpUpload
{ String filename;String filename1;FtpClient ftpClient;
public void connectServer(string server,string user,string password,string path)
{
//serverQFTP服务器的IP地址Quser:dFTP服务器的用户?br>//passwordQ登录FTP服务器的用户名的口oQpathQFTP服务器上的\?br>try{ ftpClient=new FtpClient();
ftpClient.openServer(server);
ftpClient.login(user, password);
System.out.println("login success!");
if (path.length()!=0) ftpClient.cd(path);
ftpClient.binary(); }catch (IOException ex) {System.out.println(ex);}
}
public void closeConnect()
{try{ ftpClient.closeServer();
}catch (IOException ex) {System.out.println(ex);}
}
public void upload()
{ filename1=findFileName(filename);
//从filename中分析出文g的名Uͼ作ؓ目标文g的名U?具体Ҏ实现未给?br>try {
TelnetOutputStream os=ftpClient.put(filename1);
java.io.File file_in=new java.io.File(filename);
FileInputStream is=new FileInputStream(file_in);
byte[] bytes=new byte[1024];
int c;
while ((c=is.read(bytes))!=-1){ os.write(bytes,0,c); }
is.close(); os.close();
} catch (IOException ex) {System.out.println(ex);}
}
}

  connectServer()完成与FTP服务器徏立连接的功能Q用FtpClient的openServer(string server)Ҏ打开q程FTP服务?然后使用FtpClient的login(user, password)Ҏd服务器。登录远EFTP服务器有两种方式Q一U是注册用户dQ另一U是以匿名方式登录。前者要求用户首先注册ؓ服务器的客户Q服务器会给客户一个登录̎号和密码Q依据̎号和密码q结到服务器上。后者要求用户不用注册而用特D的用户?annoymous"?guest"有限制的讉Kq程L的公开文gQ现在许多系l要求用户将Email地址作ؓ口o。出于安全的目的Q大部分匿名FTPL一般只允许q程用户下蝲文gQ而不允许上传Q这依赖于FTP服务器的讄。用户可Ҏ实际情况选择使用两种方式。登录完成后使用FtpClient的binary()Ҏ初始化传输方式ؓ字节方式。upload()完成文g的上传功能。创建源文g的文件输入流FileInputStream,输入流写入到字节数l中Q利用TelnetOutputStream的writeҎ字节数l中的数据写入到一个网l链接上。由于TelnetOutputStream打开的是FTP服务器上的一个文Ӟ所以数据写入到了目标文件中Q这样就完成了文件上传。closeConnect()要求与服务器断开q接?/p>

  以上只是单个文g上传的过E,如果是多个文件可以多ơ调用此上传q程。由以上两种方式我们可以看出采用FTP协议实现多个文g的上传比较简单,Ҏ实现。利用FTP协议上传文g一般是~写的客L的程序,服务器端的安全设|会比较复杂Q而利用HTTP协议上传文g则是服务器端的应用程序,相对来说安全讄会比较简单。ƈ且通过试发现FTP上传方式在传输大文g旉度是HTTP上传方式的几十倍甚臛_癑ր,但在传输于1M的文件时却比HTTP上传方式E慢一些。所以说两种传输方式各有优势Q请读者根据自w情况量力而行。如果有什么问题或者是需要其他部分的源码Q请与我联系Q?
 



alone 2007-05-11 17:55 发表评论
]]>
jsp 上传下蝲完成代码http://m.tkk7.com/alone/archive/2007/05/11/jsp.htmlalonealoneFri, 11 May 2007 09:52:00 GMThttp://m.tkk7.com/alone/archive/2007/05/11/jsp.htmlhttp://m.tkk7.com/alone/comments/116818.htmlhttp://m.tkk7.com/alone/archive/2007/05/11/jsp.html#Feedback0http://m.tkk7.com/alone/comments/commentRss/116818.htmlhttp://m.tkk7.com/alone/services/trackbacks/116818.html 


================================UPLOAD.HTML=======================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文g上传</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<p> </p>
<p align="center">上传文g选择</p>
<FORM METHOD="POST" ACTION="upload.jsp"
ENCTYPE="multipart/form-data">
<input type="hidden" name="TEST" value="good">
  <table width="75%" border="1" align="center">
    <tr>
      <td><div align="center">1?
          <input type="FILE" name="FILE1" size="30">
        </div></td>
    </tr>
    <tr>
      <td><div align="center">2?
          <input type="FILE" name="FILE2" size="30">
        </div></td>
    </tr>
    <tr>
      <td><div align="center">3?
          <input type="FILE" name="FILE3" size="30">
        </div></td>
    </tr>
    <tr>
      <td><div align="center">4?
          <input type="FILE" name="FILE4" size="30">
        </div></td>
    </tr>
    <tr>
      <td><div align="center">
          <input type="submit" name="Submit" value="上传它!">
        </div></td>
    </tr>
  </table>
</FORM>
</body>
</html>

================================END=======================================
================================upload.jsp================================
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="com.jspsmart.upload.*"%>
<%@ page import="java.util.*"%>
<html>
<head>
<title>文g上传处理面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
// 新徏一个SmartUpload对象
SmartUpload su = new SmartUpload();
// 上传初始?br>su.initialize(pageContext);
// 讑֮上传限制
// 1.限制每个上传文g的最大长度?br>// su.setMaxFileSize(10000);
// 2.限制M传数据的长度?br>// su.setTotalMaxFileSize(20000);
// 3.讑֮允许上传的文Ӟ通过扩展名限Ӟ,仅允许doc,txt文g?br>// su.setAllowedFilesList("doc,txt");
// 4.讑֮止上传的文Ӟ通过扩展名限Ӟ,止上传带有exe,bat,jsp,htm,html扩展名的文g和没有扩展名的文件?br>// su.setDeniedFilesList("exe,bat,jsp,htm,html,,");
// 上传文g
su.upload();
// 上传文件全部保存到指定目录
int count = su.save("/upload");
out.println(count+"个文件上传成功!<br>");

// 利用Request对象获取参数之?br>out.println("TEST="+su.getRequest().getParameter("TEST")+"<BR><BR>");

// 逐一提取上传文g信息Q同时可保存文g?br>for (int i=0;i<su.getFiles().getCount();i++)
{
com.jspsmart.upload.File file = su.getFiles().getFile(i);

// 若文件不存在则l?br>if (file.isMissing()) continue;

// 昄当前文g信息
out.println("<TABLE BORDER=1>");
out.println("<TR><TD>表单名QFieldNameQ?lt;/TD><TD>"+ file.getFieldName() + "</TD></TR>");
out.println("<TR><TD>文g长度QSizeQ?lt;/TD><TD>" + file.getSize() + "</TD></TR>");
out.println("<TR><TD>文g名(FileNameQ?lt;/TD><TD>" + file.getFileName() + "</TD></TR>");
out.println("<TR><TD>文g扩展名(FileExtQ?lt;/TD><TD>" + file.getFileExt() + "</TD></TR>");
out.println("<TR><TD>文g全名QFilePathNameQ?lt;/TD><TD>"+ file.getFilePathName() + "</TD></TR>");
out.println("</TABLE><BR>");

// 文件另?br>// file.saveAs("/upload/" + myFile.getFileName());
// 另存CWEB应用E序的根目录为文件根目录的目录下
// file.saveAs("/upload/" + myFile.getFileName(), su.SAVE_VIRTUAL);
// 另存到操作系l的根目录ؓ文g根目录的目录?br>// file.saveAs("c:\\temp\\" + myFile.getFileName(), su.SAVE_PHYSICAL);
}
%>
</body>
</html>
================================END=======================================
================================download.html=============================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>下蝲</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<a href="download.jsp">点击下蝲</a>
</body>
</html>
================================END=======================================

================================download.jsp==============================
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="com.jspsmart.upload.*"%>
<%
//新徏一个SmartUpload对象
SmartUpload su=new SmartUpload();
// 初始?br>su.initialize(pageContext);
// 讑֮contentDisposition为null以禁止浏览器自动打开文gQ?br>//保证点击链接后是下蝲文g。若不设定,则下载的文g扩展名ؓ
//docӞ览器将自动用word打开它。扩展名为pdfӞ
//览器将用acrobat打开?br>su.setContentDisposition(null);
// 下蝲文g
su.downloadFile("/upload/mobile.txt");
%>
 
================================END=======================================



alone 2007-05-11 17:52 发表评论
]]>
java讉KACCESS数据?/title><link>http://m.tkk7.com/alone/archive/2007/05/11/java.html</link><dc:creator>alone</dc:creator><author>alone</author><pubDate>Fri, 11 May 2007 07:58:00 GMT</pubDate><guid>http://m.tkk7.com/alone/archive/2007/05/11/java.html</guid><wfw:comment>http://m.tkk7.com/alone/comments/116764.html</wfw:comment><comments>http://m.tkk7.com/alone/archive/2007/05/11/java.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/alone/comments/commentRss/116764.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/alone/services/trackbacks/116764.html</trackback:ping><description><![CDATA[import java.sql.*;<br>public class access{<br>public static void main(String args[]){<br> Connection con;<br> Statement sql; //声明Statement对象<br> ResultSet rs;<br>try{<br> Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");<br> }<br>catch(ClassNotFoundException e){<br>System.out.println(""+e);<br>}<br>try{<br> con=DriverManager.getConnection("jdbc:odbc:redsun","","");<br>sql=con.createStatement();<br>rs=sql.executeQuery("Select * FROM member");<br>while(rs.next()){<br> String name=rs.getString(1); //获得数据库第一?br> String sex=rs.getString(2); <br>System.out.println("姓名:"+name); //输出信息<br>System.out.println("性别:"+sex);<br>   }<br>con.close();<br>}<br>catch(SQLException el){}<br> }<br>} <img src ="http://m.tkk7.com/alone/aggbug/116764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/alone/" target="_blank">alone</a> 2007-05-11 15:58 <a href="http://m.tkk7.com/alone/archive/2007/05/11/java.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>上传下蝲全攻略jspSmartUpload http://m.tkk7.com/alone/archive/2007/05/11/116753.htmlalonealoneFri, 11 May 2007 07:41:00 GMThttp://m.tkk7.com/alone/archive/2007/05/11/116753.htmlhttp://m.tkk7.com/alone/comments/116753.htmlhttp://m.tkk7.com/alone/archive/2007/05/11/116753.html#Feedback0http://m.tkk7.com/alone/comments/commentRss/116753.htmlhttp://m.tkk7.com/alone/services/trackbacks/116753.html一、安装篇

  jspSmartUpload是由www.jspsmart.com|站开发的一个可免费使用的全功能的文件上传下载组Ӟ适于嵌入执行上传下蝲操作的JSP文g中。该lg有以下几个特点:

1、用简单。在JSP文g中仅仅书写三五行JAVA代码可以搞定文件的上传或下载,方便?

2、能全程控制上传。利用jspSmartUploadlg提供的对象及其操作方法,可以获得全部上传文g的信息(包括文g名,大小Q类型,扩展名,文g数据{)Q方便存取?

3、能对上传的文g在大、类型等斚w做出限制。如此可以o掉不W合要求的文件?

4、下载灵zR仅写两行代码,p把Web服务器变成文件服务器。不文件在Web服务器的目录下或在其它Q何目录下Q都可以利用jspSmartUploadq行下蝲?

5、能文件上传到数据库中Q也能将数据库中的数据下载下来。这U功能针对的是MYSQL数据库,因ؓ不具有通用性,所以本文不准备举例介绍q种用法?

  jspSmartUploadlg可以?a >www.jspsmart.com|站上自׃载,压羃包的名字是jspSmartUpload.zip。下载后Q用WinZip或WinRAR其解压到Tomcat的webapps目录下(本文以Tomcat服务器ؓ例进行介l)。解压后Q将webapps/jspsmartupload目录下的子目录Web-inf名字改ؓ全大写的WEB-INFQ这样一改jspSmartUploadcL能用。因为TomcatҎ件名大小写敏感,它要求Web应用E序相关的类所在目录ؓWEB-INFQ且必须是大写。接着重新启动TomcatQ这样就可以在JSP文g中用jspSmartUploadlg了?

  注意Q按上述Ҏ安装后,只有webapps/jspsmartupload目录下的E序可以使用jspSmartUploadlgQ如果想让Tomcat服务器的所有Web应用E序都能用它Q必d如下工作Q?

1Q进入命令行状态,目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下?

2Q运行JAR打包命oQjar cvf jspSmartUpload.jar com

Q也可以打开资源理器,切换到当前目录,用WinZipcom目录下的所有文件压~成jspSmartUpload.zipQ然后将jspSmartUpload.zip换名为jspSmartUpload.jar文g卛_。)

3Q将jspSmartUpload.jar拯到Tomcat的shared/lib目录下?

二、相关类说明?

?Filec?

  q个cd装了一个上传文件的所有信息。通过它,可以得到上传文g的文件名、文件大、扩展名、文件数据等信息?

  FilecM要提供以下方法:

1、saveAs作用Q将文g换名另存?

原型Q?

public void saveAs(java.lang.String destFilePathName)

?

public void saveAs(java.lang.String destFilePathName, int optionSaveAs)

其中QdestFilePathName是另存的文g名,optionSaveAs是另存的选项Q该选项有三个|分别是SAVEAS_PHYSICAL,SAVEAS_VIRTUALQSAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系l的根目录ؓ文g根目录另存文ӞSAVEAS_VIRTUAL表明以Web应用E序的根目录为文件根目录另存文gQSAVEAS_AUTO则表Clg军_Q当Web应用E序的根目录存在另存文g的目录时Q它会选择SAVEAS_VIRTUALQ否则会选择SAVEAS_PHYSICAL?

例如QsaveAs("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘,则另存的文g名实际是c:\upload\sample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用E序的根目录是webapps/jspsmartuploadQ则另存的文件名实际是webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip",SAVEAS_AUTO)执行时若Web应用E序根目录下存在upload目录Q则其效果同saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)Q否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)?

Q对于WebE序的开发来_最好用SAVEAS_VIRTUALQ以便移植?

2、isMissing

作用Q这个方法用于判断用h否选择了文Ӟ也即对应的表单项是否有倹{选择了文件时Q它q回false。未选文件时Q它q回true?

原型Qpublic boolean isMissing()

3、getFieldName

作用Q取HTML表单中对应于此上传文件的表单的名字?

原型Qpublic String getFieldName()

4、getFileName

作用Q取文g名(不含目录信息Q?

原型Qpublic String getFileName()

5、getFilePathName

作用Q取文g全名Q带目录Q?

原型Qpublic String getFilePathName

6、getFileExt

作用Q取文g扩展名(后缀Q?

原型Qpublic String getFileExt()

7、getSize

作用Q取文g长度Q以字节计)

原型Qpublic int getSize()

8、getBinaryData

作用Q取文g数据中指定位Ud的一个字节,用于文件等处理?

原型Qpublic byte getBinaryData(int index)。其中,index表示位移Q其值在0到getSize()-1之间?

?Filesc?

  q个c表C所有上传文件的集合Q通过它可以得C传文件的数目、大等信息。有以下ҎQ?

1、getCount

作用Q取得上传文件的数目?

原型Qpublic int getCount()

2、getFile

作用Q取得指定位Ud的文件对象FileQ这是com.jspsmart.upload.FileQ不是java.io.FileQ注意区分)?

原型Qpublic File getFile(int index)。其中,index为指定位U,其值在0到getCount()-1之间?

3、getSize

作用Q取得上传文件的总长度,可用于限制一ơ性上传的数据量大?

原型Qpublic long getSize()

4、getCollection

作用Q将所有上传文件对象以Collection的Ş式返回,以便其它应用E序引用Q浏览上传文件信息?

原型Qpublic Collection getCollection()

5、getEnumeration

作用Q将所有上传文件对象以EnumerationQ枚举)的Ş式返回,以便其它应用E序览上传文g信息?

原型Qpublic Enumeration getEnumeration()

?Requestc?

  q个cȝ功能{同于JSP内置的对象request。只所以提供这个类Q是因ؓ对于文g上传表单Q通过request对象无法获得表单的|必须通过jspSmartUploadlg提供的Request对象来获取。该cL供如下方法:

1、getParameter

作用Q获取指定参C倹{当参数不存在时Q返回gؓnull?

原型Qpublic String getParameter(String name)。其中,name为参数的名字?

2、getParameterValues

作用Q当一个参数可以有多个值时Q用此方法来取其倹{它q回的是一个字W串数组。当参数不存在时Q返回gؓnull?

原型Qpublic String[] getParameterValues(String name)。其中,name为参数的名字?

3、getParameterNames

作用Q取得Request对象中所有参数的名字Q用于遍历所有参数。它q回的是一个枚丑֞的对象?

原型Qpublic Enumeration getParameterNames()

?SmartUploadc这个类完成上传下蝲工作?

AQ上传与下蝲q的方法:

只有一个:initialize?

作用Q执行上传下载的初始化工作,必须W一个执行?

原型Q有多个Q主要用下面这个:

public final void initialize(javax.servlet.jsp.PageContext pageContext)

其中QpageContext为JSP面内置对象Q页面上下文Q?

BQ上传文件用的ҎQ?

1、upload

作用Q上传文件数据。对于上传操作,W一步执行initializeҎQ第二步p执行q个Ҏ?

原型Qpublic void upload()

2、save

作用Q将全部上传文g保存到指定目录下Qƈq回保存的文件个数?

原型Qpublic int save(String destPathName)

和public int save(String destPathName,int option)

其中QdestPathName为文件保存目录,optionZ存选项Q它有三个|分别是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。(同FilecȝsaveAsҎ的选项之值类|SAVE_PHYSICAL指示lg文件保存到以操作系l根目录为文件根目录的目录下QSAVE_VIRTUAL指示lg文件保存到以Web应用E序根目录ؓ文g根目录的目录下,而SAVE_AUTO则表C由lg自动选择?

注:save(destPathName)作用{同于save(destPathName,SAVE_AUTO)?

3、getSize

作用Q取上传文g数据的总长?

原型Qpublic int getSize()

4、getFiles

作用Q取全部上传文gQ以Files对象形式q回Q可以利用Filescȝ操作Ҏ来获得上传文件的数目{信息?

原型Qpublic Files getFiles()

5、getRequest

作用Q取得Request对象Q以便由此对象获得上传表单参C倹{?

原型Qpublic Request getRequest()

6、setAllowedFilesList

作用Q设定允怸传带有指定扩展名的文Ӟ当上传过E中有文件名不允许时Q组件将抛出异常?

原型Qpublic void setAllowedFilesList(String allowedFilesList)

其中QallowedFilesList为允怸传的文g扩展名列表,各个扩展名之间以逗号分隔。如果想允许上传那些没有扩展名的文gQ可以用两个逗号表示。例如:setAllowedFilesList("doc,txt,,")允怸传带doc和txt扩展名的文g以及没有扩展名的文g?

7、setDeniedFilesList

作用Q用于限制上传那些带有指定扩展名的文件。若有文件扩展名被限Ӟ则上传时lg抛出异常?

原型Qpublic void setDeniedFilesList(String deniedFilesList)

其中QdeniedFilesList为禁止上传的文g扩展名列表,各个扩展名之间以逗号分隔。如果想止上传那些没有扩展名的文gQ可以用两个逗号来表C。例如:setDeniedFilesList("exe,bat,,")禁止上传带exe和bat扩展名的文g以及没有扩展名的文g?

8、setMaxFileSize

作用Q设定每个文件允怸传的最大长度?

原型Qpublic void setMaxFileSize(long maxFileSize)

其中QmaxFileSizeZؓ每个文g允许上传的最大长度,当文件超出此长度Ӟ不被上传?

9、setTotalMaxFileSize

作用Q设定允怸传的文g的总长度,用于限制一ơ性上传的数据量大?

原型Qpublic void setTotalMaxFileSize(long totalMaxFileSize)

其中QtotalMaxFileSize为允怸传的文g的总长度?/p>

 

1、setContentDisposition

作用Q将数据q加到MIME文g头的CONTENT-DISPOSITION域。jspSmartUploadlg会在q回下蝲的信息时自动填写MIME文g头的CONTENT-DISPOSITION域,如果用户需要添加额外信息,L此方法?

原型Qpublic void setContentDisposition(String contentDisposition)

其中QcontentDispositiond的数据。如果contentDisposition为nullQ则lg自动添?attachment;"Q以表明下载的文g作ؓ附gQ结果是IE览器将会提C另存文Ӟ而不是自动打开q个文gQIE览器一般根据下载的文g扩展名决定执行什么操作,扩展名ؓdoc的将用wordE序打开Q扩展名为pdf的将用acrobatE序打开Q等{)?

2、downloadFile

作用Q下载文件?

原型Q共有以下三个原型可用,W一个最常用Q后两个用于Ҏ情况下的文g下蝲Q如更改内容cdQ更改另存的文g名)?

?public void downloadFile(String sourceFilePathName)

其中QsourceFilePathName下蝲的文件名Q带目录的文件全名)

?public void downloadFile(String sourceFilePathName,String contentType)

其中QsourceFilePathName下蝲的文件名Q带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被览器识别)?

?public void downloadFile(String sourceFilePathName,String contentType,String destFileName)

其中QsourceFilePathName下蝲的文件名Q带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被览器识别),destFileNameZ载后默认的另存文件名?

三、文件上传篇

?表单要求

对于上传文g的FORM表单Q有两个要求Q?

1、METHOD应用POSTQ即METHOD="POST"?

2、增加属性:ENCTYPE="multipart/form-data"

下面是一个用于上传文件的FORM表单的例子:

 

<FORM METHOD="POST" ENCTYPE="multipart/form-data"
ACTION="/jspSmartUpload/upload.jsp">
<INPUT TYPE="FILE" NAME="MYFILE">
<INPUT TYPE="SUBMIT">
</FORM>
 


?上传的例?

1、上传页面upload.html

本页面提供表单,让用户选择要上传的文gQ点?上传"按钮执行上传操作?

面源码如下Q?

<!--
    文g名:upload.html
?nbsp; 者:U|软g制作中心雨亦?zhsoft88@sohu.com)
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文g上传</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<p> </p>
<p align="center">上传文g选择</p>
<FORM METHOD="POST" ACTION="jsp/do_upload.jsp"
ENCTYPE="multipart/form-data">
<input type="hidden" name="TEST" value="good">
  <table width="75%" border="1" align="center">
    <tr>
      <td><div align="center">1?
          <input type="FILE" name="FILE1" size="30">
        </div></td>
    </tr>
    <tr>
      <td><div align="center">2?
          <input type="FILE" name="FILE2" size="30">
        </div></td>
    </tr>
    <tr>
      <td><div align="center">3?
          <input type="FILE" name="FILE3" size="30">
        </div></td>
    </tr>
    <tr>
      <td><div align="center">4?
          <input type="FILE" name="FILE4" size="30">
        </div></td>
    </tr>
    <tr>
      <td><div align="center">
          <input type="submit" name="Submit" value="上传它!">
        </div></td>
    </tr>
  </table>
</FORM>
</body>
</html>
 


2、上传处理页面do_upload.jsp

本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法Q在此不赘述了?

面源码如下Q?

<%--
文g名:do_upload.jsp
?nbsp; 者:U|软g制作中心雨亦?zhsoft88@sohu.com)
--%>
<%@ page contentType="text/html; charset=gb2312" language="java"
import="java.util.*,com.jspsmart.upload.*" errorPage="" %>
<html>
<head>
<title>文g上传处理面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<%
// 新徏一个SmartUpload对象
SmartUpload su = new SmartUpload();
// 上传初始?br>su.initialize(pageContext);
// 讑֮上传限制
// 1.限制每个上传文g的最大长度?br>// su.setMaxFileSize(10000);
// 2.限制M传数据的长度?br>// su.setTotalMaxFileSize(20000);
// 3.讑֮允许上传的文Ӟ通过扩展名限Ӟ,仅允许doc,txt文g?br>// su.setAllowedFilesList("doc,txt");
// 4.讑֮止上传的文Ӟ通过扩展名限Ӟ,止上传带有exe,bat,
jsp,htm,html扩展名的文g和没有扩展名的文件?br>// su.setDeniedFilesList("exe,bat,jsp,htm,html,,");
// 上传文g
su.upload();
// 上传文件全部保存到指定目录
int count = su.save("/upload");
out.println(count+"个文件上传成功!<br>");

// 利用Request对象获取参数之?br>out.println("TEST="+su.getRequest().getParameter("TEST")
+"<BR><BR>");

// 逐一提取上传文g信息Q同时可保存文g?br>for (int i=0;i<su.getFiles().getCount();i++)
{
com.jspsmart.upload.File file = su.getFiles().getFile(i);

// 若文件不存在则l?br>if (file.isMissing()) continue;

// 昄当前文g信息
out.println("<TABLE BORDER=1>");
out.println("<TR><TD>表单名QFieldNameQ?lt;/TD><TD>"
+ file.getFieldName() + "</TD></TR>");
out.println("<TR><TD>文g长度QSizeQ?lt;/TD><TD>" +
file.getSize() + "</TD></TR>");
out.println("<TR><TD>文g名(FileNameQ?lt;/TD><TD>"
+ file.getFileName() + "</TD></TR>");
out.println("<TR><TD>文g扩展名(FileExtQ?lt;/TD><TD>"
+ file.getFileExt() + "</TD></TR>");
out.println("<TR><TD>文g全名QFilePathNameQ?lt;/TD><TD>"
+ file.getFilePathName() + "</TD></TR>");
out.println("</TABLE><BR>");

// 文件另?br>// file.saveAs("/upload/" + myFile.getFileName());
// 另存CWEB应用E序的根目录为文件根目录的目录下
// file.saveAs("/upload/" + myFile.getFileName(),
su.SAVE_VIRTUAL);
// 另存到操作系l的根目录ؓ文g根目录的目录?br>// file.saveAs("c:\\temp\\" + myFile.getFileName(),
su.SAVE_PHYSICAL);

}
%>
</body>
</html>
 


四、文件下载篇

1、下载链接页面download.html

面源码如下Q?

<!--
文g名:download.html
?nbsp; 者:U|软g制作中心雨亦?zhsoft88@sohu.com)
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>下蝲</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<a href="jsp/do_download.jsp">点击下蝲</a>
</body>
</html>
 


2、下载处理页面do_download.jsp do_download.jsp展示了如何利用jspSmartUploadlg来下载文Ӟ从下面的源码中就可以看到Q下载何其简单?

源码如下Q?

<%@ page contentType="text/html;charset=gb2312"
import="com.jspsmart.upload.*" %><%
// 新徏一个SmartUpload对象
SmartUpload su = new SmartUpload();
// 初始?br>su.initialize(pageContext);
// 讑֮contentDisposition为null以禁止浏览器自动打开文gQ?br>//保证点击链接后是下蝲文g。若不设定,则下载的文g扩展名ؓ
//docӞ览器将自动用word打开它。扩展名为pdfӞ
//览器将用acrobat打开?br>su.setContentDisposition(null);
// 下蝲文g
su.downloadFile("/upload/如何赚取我的W一桉.doc");
%>
 


注意Q执行下载的面Q在Java脚本范围外(?lt;% ... %>之外Q,不要包含HTML代码、空根{回车或换行{字W,有的话将不能正确下蝲。不信的话,可以在上q源码中%><%之间加入一个换行符Q再下蝲一下,保证出错。因为它影响了返回给览器的数据,D解析出错?

3、如何下载中文文?

jspSmartUpload虽然能下载文Ӟ但对中文支持不。若下蝲的文件名中有汉字Q则览器在提示另存的文件名Ӟ昄的是一堆ؕ码,很扫人兴。上面的例子是q样。(q个问题也是众多下蝲lg所存在的问题,很少有h解决Q搜索不到相兌料,可叹Q)

ZljspSmartUploadlg增加下蝲中文文g的支持,我对该组件进行了研究Q发现对q回l浏览器的另存文件名q行UTF-8~码后,览器便能正显CZ文名字了。这是一个o人高兴的发现。于是我对jspSmartUploadlg的SmartUploadcd了升U处理,增加了toUtf8Stringq个ҎQ改动部分源码如下:

public void downloadFile(String s, String s1, String s2, int i)
throws ServletException, IOException, SmartUploadException
    {
if(s == null)
    throw new IllegalArgumentException("File ''" + s +
    "'' not found (1040).");
if(s.equals(""))
    throw new IllegalArgumentException("File ''" + s +
    "'' not found (1040).");
if(!isVirtual(s) && m_denyPhysicalPath)
    throw new SecurityException("Physical path is
    denied (1035).");
if(isVirtual(s))
    s = m_application.getRealPath(s);
java.io.File file = new java.io.File(s);
FileInputStream fileinputstream = new FileInputStream(file);
long l = file.length();
boolean flag = false;
int k = 0;
byte abyte0[] = new byte[i];
if(s1 == null)
    m_response.setContentType("application/x-msdownload");
else
if(s1.length() == 0)
    m_response.setContentType("application/x-msdownload");
else
    m_response.setContentType(s1);
m_response.setContentLength((int)l);
m_contentDisposition = m_contentDisposition != null ?
m_contentDisposition : "attachment;";
if(s2 == null)
    m_response.setHeader("Content-Disposition",
    m_contentDisposition + " filename=" +
    toUtf8String(getFileName(s)));
else
if(s2.length() == 0)
    m_response.setHeader("Content-Disposition",
    m_contentDisposition);
else
    m_response.setHeader("Content-Disposition",
    m_contentDisposition + " filename=" + toUtf8String(s2));
while((long)k < l)
{
    int j = fileinputstream.read(abyte0, 0, i);
    k += j;
    m_response.getOutputStream().write(abyte0, 0, j);
}
fileinputstream.close();
    }

    /**
     * 文件名中的汉字转ؓUTF8~码的串,以便下蝲时能正确昄另存的文件名.
     * U|软g制作中心雨亦?003.08.01
     * @param s 原文件名
     * @return 重新~码后的文g?br>     */
    public static String toUtf8String(String s) {
StringBuffer sb = new StringBuffer();
for (int i=0;i<s.length();i++) {
    char c = s.charAt(i);
    if (c >= 0 && c <= 255) {
sb.append(c);
    } else {
byte[] b;
try {
    b = Character.toString(c).getBytes("utf-8");
} catch (Exception ex) {
    System.out.println(ex);
    b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
    int k = b[j];
    if (k < 0) k += 256;
    sb.append("%" + Integer.toHexString(k).
    toUpperCase());
}
    }
}
return sb.toString();
    }
 


注意源码中粗体部分,原jspSmartUploadlg对返回的文g未作M处理Q现在做了编码的转换工作Q将文g名{换ؓUTF-8形式的编码Ş式。UTF-8~码对英文未作Q何处理,对中文则需要{换ؓ%XX的Ş式。toUtf8StringҎ中,直接利用Java语言提供的编码{换方法获得汉字字W的UTF-8~码Q之后将其{换ؓ%XX的Ş式?

源码编译后打包成jspSmartUpload.jarQ拷贝到Tomcat的shared/lib目录下(可ؓ所有WEB应用E序所׃nQ,然后重启Tomcat服务器就可以正常下蝲含有中文名字的文件了。另QtoUtf8StringҎ也可用于转换含有中文的超U链接,以保证链接的有效Q因为有的WEB服务器不支持中文链接?

结QjspSmartUploadlg是应用JSPq行B/SE序开发过E中l常使用的上传下载组Ӟ它用简单,方便。现在我又ؓ其加上了下蝲中文名字的文件的支持Q真个是如虎ȝQ必赢得更多开发者的青睐?/p>

alone 2007-05-11 15:41 发表评论
]]>
文g上传E序http://m.tkk7.com/alone/archive/2007/05/11/javauploadfile.htmlalonealoneFri, 11 May 2007 07:34:00 GMThttp://m.tkk7.com/alone/archive/2007/05/11/javauploadfile.htmlhttp://m.tkk7.com/alone/comments/116751.htmlhttp://m.tkk7.com/alone/archive/2007/05/11/javauploadfile.html#Feedback0http://m.tkk7.com/alone/comments/commentRss/116751.htmlhttp://m.tkk7.com/alone/services/trackbacks/116751.htmlimport java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.PageContext;

public class UploadFile
{
private ServletRequest request;
private ServletResponse response;
private ServletConfig config;
ServletInputStream DATA;
int FormSize;
File f1;
FileOutputStream os;
DataInputStream is;
String filename;
byte[] b;
byte t;
boolean flag=false;
public UploadFile()
{ }
public void initialize(ServletConfig config,HttpServletRequest request,HttpServletResponse response) throws IOException
{
this.request=request;
this.response=response;
this.config=config;
DATA = request.getInputStream();
FormSize=request.getContentLength();
}
public void initialize(PageContext pageContext) throws IOException
{
request=pageContext.getRequest();
response=pageContext.getResponse();
config=pageContext.getServletConfig();
DATA = request.getInputStream();
FormSize=request.getContentLength();
}
public boolean setFilename(String s)
{
try
{
File f1=new File(s);
os=new FileOutputStream(f1);
}
catch(IOException e)
{return(false);}
return(true);
}
public void getByte()
{
int i=0;
try
{
is=new DataInputStream(DATA);
b=new byte[FormSize];

while (true)
{
try
{
t=is.readByte();
b[i]=t;
i++;
}
catch(EOFException e)
{ break;}
}
is.close();}
catch(IOException e)
{}
}

public boolean save()
{
int i=0,start1=0,start2=0;
String temp="";
if (!flag)
{
getByte();
flag=true;
}
try
{
temp=new String(b,"ISO8859_1");
}
catch(UnsupportedEncodingException e)
{return(false);}

start1=temp.indexOf("image/");
temp=temp.substring(start1);

start1=temp.indexOf("\r\n\r\n");

temp=temp.substring(start1+4);
start2=temp.indexOf(";\r\n");
if (start2!=-1)
{
temp=temp.substring(0,start2);
}
try
{
byte[] img=temp.getBytes("ISO8859_1");
for (i=0;i<img.length;i++)
{ os.write(img[i]); }
os.close();
}
catch(IOException e)
{return(false);}

return(true);

}
}



alone 2007-05-11 15:34 发表评论
]]>
How to Read the Value of an HTTP Headerhttp://m.tkk7.com/alone/archive/2007/04/30/HTTP_Header.htmlalonealoneMon, 30 Apr 2007 02:34:00 GMThttp://m.tkk7.com/alone/archive/2007/04/30/HTTP_Header.htmlhttp://m.tkk7.com/alone/comments/114725.htmlhttp://m.tkk7.com/alone/archive/2007/04/30/HTTP_Header.html#Feedback0http://m.tkk7.com/alone/comments/commentRss/114725.htmlhttp://m.tkk7.com/alone/services/trackbacks/114725.htmlHow to Read the Value of an HTTP Header

In the above sections, we have gone through several HTTP headers that are useful for user agent detection and device capabilities detection. Now one essential question remains: how to read the value of an HTTP header?

Reading the value of an HTTP header is not difficult. Just use a server-side scripting technology to write a few lines of code. We will demonstrate how to read the value of an HTTP header using ASP, Java Servlet / JSP, Perl and PHP below.

Retrieving HTTP Headers with ASP
In ASP, you can use the ServerVariables collection of the Request object to retrieve the value of HTTP headers. You can choose either VBScript or JScript (JavaScript implemented by Microsoft) as the scripting language. If you use VBScript, the code for reading HTTP headers should be like this:

 ' Declaring variables
Dim accept
Dim user_agent
Dim accept_charset
Dim accept_language
Dim x_wap_profile
Dim profile

accept = Request.ServerVariables("HTTP_ACCEPT")
user_agent = Request.ServerVariables("HTTP_USER_AGENT")
accept_charset = Request.ServerVariables("HTTP_ACCEPT_CHARSET")
accept_language = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")
x_wap_profile = Request.ServerVariables("HTTP_X_WAP_PROFILE")
profile = Request.ServerVariables("HTTP_PROFILE")

 As you can see above, to retrieve the value of an HTTP header in ASP, we use Request.ServerVariables("HTTP_x"), where x is the HTTP header name with all the "-" characters replaced with the "_" character. ASP has other pre-defined server environment variables that can be placed inside the parentheses of ServerVariables() but we are not going to discuss about them since they are not useful to us here.

If you use JScript, the code for reading HTTP headers should look like this:

 


var accept = Request.ServerVariables("HTTP_ACCEPT");
var user_agent = Request.ServerVariables("HTTP_USER_AGENT");
var accept_charset = Request.ServerVariables("HTTP_ACCEPT_CHARSET");
var accept_language = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE");
var x_wap_profile = Request.ServerVariables("HTTP_X_WAP_PROFILE");
var profile = Request.ServerVariables("HTTP_PROFILE");

 Retrieving HTTP Headers with Java Servlet / JSP
In Java Servlet or JSP, you can use the getHeader() method of the javax.servlet.http.HttpServletRequest object to retrieve the value of HTTP headers. Here is the code for reading HTTP headers:

 String accept = request.getHeader("accept");
String user_agent = request.getHeader("user-agent");
String accept_charset = request.getHeader("accept-charset");
String accept_language = request.getHeader("accept-language");
String x_wap_profile = request.getHeader("x-wap-profile");
String profile = request.getHeader("profile");

 As you can see, to retrieve the value of an HTTP header whose name is x in Java Servlet or JSP, we use request.getHeader("x"), where request is an instance of the javax.servlet.http.HttpServletRequest class.

 Retrieving HTTP Headers with Perl
In Perl, the values of HTTP headers are stored in the %ENV hash. Here is the code for retrieving HTTP headers:

 $accept = $ENV{"HTTP_ACCEPT"};
$user_agent = $ENV{"HTTP_USER_AGENT"};
$accept_charset = $ENV{"HTTP_ACCEPT_CHARSET"};
$accept_language = $ENV{"HTTP_ACCEPT_LANGUAGE"};
$x_wap_profile = $ENV{"HTTP_X_WAP_PROFILE"};
$profile = $ENV{"HTTP_PROFILE"};

 As you can see above, to retrieve the value of an HTTP header in Perl, we use $ENV{"HTTP_x"}, where x is the HTTP header name with all the "-" characters replaced with the "_" character. Perl has other pre-defined values that can be placed inside the braces of $ENV{} but we are not going to discuss about them since they are not useful to us here.

 Retrieving HTTP Headers with PHP

In PHP, the value of HTTP headers are stored in the $_SERVER array. Here is the code for retrieving HTTP headers:

 $accept = $_SERVER["HTTP_ACCEPT"];
$user_agent = $_SERVER["HTTP_USER_AGENT"];
$accept_charset = $_SERVER["HTTP_ACCEPT_CHARSET"];
$accept_language = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
$x_wap_profile = $_SERVER["HTTP_X_WAP_PROFILE"];
$profile = $_SERVER["HTTP_PROFILE"];

 As you can see above, to retrieve the value of an HTTP header in PHP, we use $_SERVER["HTTP_x"], where x is the HTTP header name with all the "-" characters replaced with the "_" character. PHP has other pre-defined values that can be placed inside the square brackets of $_SERVER[] but we are not going to discuss about them since they are not useful to us here



alone 2007-04-30 10:34 发表评论
]]>
创徏表空间、回滚段、用戗表的详l语法信?/title><link>http://m.tkk7.com/alone/archive/2007/04/27/oracle.html</link><dc:creator>alone</dc:creator><author>alone</author><pubDate>Fri, 27 Apr 2007 08:12:00 GMT</pubDate><guid>http://m.tkk7.com/alone/archive/2007/04/27/oracle.html</guid><wfw:comment>http://m.tkk7.com/alone/comments/114113.html</wfw:comment><comments>http://m.tkk7.com/alone/archive/2007/04/27/oracle.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/alone/comments/commentRss/114113.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/alone/services/trackbacks/114113.html</trackback:ping><description><![CDATA[1:创徏表空?br>CREATE TABLESPACE ts_name DATAFILE '/dev/name1' SIZE 2000M, '/dev/name2' SIZE 2000M <br>DEFAULT STORAGE ( INITIAL 64K NEXT 64K MAXEXTENTS UNLIMITED PCTINCREASE 50 );<br><br>2Q修改表I间<br>alter TABLESPACE ts_name add DATAFILE '/dev/name3' SIZE 2000M;<br><br>3Q回滚段<br>CREATE ROLLBACK SEGMENT "RS01" TABLESPACE "TS_name" <br>STORAGE ( INITIAL 8M NEXT 8M MAXEXTENTS UNLIMITED);<br><br>4Q创建用户和授权<br>CREATE USER tempuser IDENTIFIED BY tempuser <br>DEFAULT TABLESPACE TS_name1 TEMPORARY TABLESPACE TS_name2;<br>GRANT CONNECT TO tempuser;<br>GRANT DBA TO tempuser;<br>GRANT resource TO tempuser;<br><br><br>5:创徏?br>create table tablename<br>(<br>f1 NUMBER(10) not null,<br>f2 NUMBER(10) null ,<br>f3 NUMBER(3) defalut 0,<br>pt number(3) not null ,<br>constraint PK_tablename primary key (f1)<br>using index<br>tablespace ts_name<br>storage<br>(<br>initial 1m<br>next 1m<br>pctincrease 0<br>)<br>)<br><br>pctfree 10<br>tablespace ts_name<br>storage<br>(<br>initial 1m<br>next 1m<br>pctincrease 0<br>)<br>partition by range(pt)<br>(partition part000 values less than (1) tablespace ts_name,<br>partition part001 values less than (2) tablespace ts_name,<br>)<br>/<br><br>6Q创建烦?br>create index i_tablename1 on tablename(f2)<br>tablespace ts_name<br>storage<br>(<br>initial 500k<br>next 500k<br>pctincrease 0<br>)<br><br> <img src ="http://m.tkk7.com/alone/aggbug/114113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/alone/" target="_blank">alone</a> 2007-04-27 16:12 <a href="http://m.tkk7.com/alone/archive/2007/04/27/oracle.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql4.1以上数据库的中文字符集的解决http://m.tkk7.com/alone/archive/2007/04/17/mysql.htmlalonealoneTue, 17 Apr 2007 06:57:00 GMThttp://m.tkk7.com/alone/archive/2007/04/17/mysql.htmlhttp://m.tkk7.com/alone/comments/111315.htmlhttp://m.tkk7.com/alone/archive/2007/04/17/mysql.html#Feedback0http://m.tkk7.com/alone/comments/commentRss/111315.htmlhttp://m.tkk7.com/alone/services/trackbacks/111315.htmlmysql4.1以上数据库的中文字符集的解决

在进入mysql控制台后Q用如下命o中设|字W集Q?br>SET character_set_client=utf8
SET character_set_connection=utf8
SET character_set_database=utf8
SET character_set_results=utf8
SET character_set_server=utf8
SET collation_connection=utf8_bin
SET collation_database=utf8_bin
SET collation_server=utf8_bin

也可以在my.ini中的[mysql]?br>CREATE DATABASE yourdatabasename
       CHARACTER SET utf8
       DEFAULT CHARACTER SET utf8
       COLLATE utf8_general_ci
       DEFAULT COLLATE utf8_general_ci ;

mysql YourDatabaseName <**.sql
对于mysql命o导入mysql 数据库的sql文gQ需要加入参敎ͼ
--default-character-set=utf8 YourDatabaseName


mysql>  show   variables   like   "%char%";
| Variable_name            | Value                                  |
| character_set_client     | latin1                                 |
| character_set_connection | latin1                                 |
| character_set_database   | utf8                                   |
| character_set_results    | latin1                                 |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | C:\your mysql home\share\charsets/ |
7 rows in set (0.00 sec)

show   variables   like   "%col%";
| Variable_name        | Value             |
| collation_connection | latin1_swedish_ci |
| collation_database   | utf8_general_ci   |
| collation_server     | utf8_general_ci   |
| protocol_version     | 10                |
4 rows in set (0.00 sec)

?.0?.1以上数据库的q移问题的解冟?br>用mysqldump 命o数据库导出4.0(-)的数据库后,?.1(+)的数据库指定导入文g的字W集Q即可?br>mysqldump –p –where="Order_ID > 2000" Meet_A_Geek Orders > Special_Dump.txt
mysql --default-character-set=utf8 YourDatabaseName <preffixtemplate_block_history.sql

 



alone 2007-04-17 14:57 发表评论
]]>
վ֩ģ壺 ˾þô߽| þþƷAɫ| þˮAV뾫Ʒ| 99Ʒѹۿ| þþþþþþ| ƷŮþþ| Ƶ| ƷһƵ| ӰԺ߹ۿ| AAAAAٸ߳Ƭѿ| һ| ޾Ʒmv߹ۿ | ھƷþþþӰԺ| ޹Ʒһҳ| ɫͼۺվ| ҹƬ߲| ձһ| ѾþҹƷ| ҹþþӰԺ| Ůҹ24ʽƵ| avһùŴ| 91Ƶѹۿ| Ƶѹۿ| Ʒþþþþþþþ| ҹ˾ƷӰ߹ۿ| ѧһëƬ| AVһۿ| þþþþùƷͬ | ҹþþþƷӰԺ| ˾ƷƵ| ޹˾þһ| ڵƵ߹ۿ | ѹʵj߹ۿ| ˾ƷѴȫ| ޹þþۺվ| ƬaëƬ| һһƬƵ| 츾avһ| ޹ƷƵ| ѸƵ| Ƶѹۿ|