SmartUpload与ftp两种上传方式的合并

2010年1月2日 root 没有评论

<%@ page language="java" import="com.jspsmart.upload.*" import="java.text.*,java.util.*,java.io.*,org.apache.commons.net.ftp.*"%>
<%@ page contentType="text/html;charset=GBK" %>

<%
int i=0;
int Size=0;
String FileName="",FileExt="",suffix="",name1="",newname="",path="",Fnewname="";

String ftpHostname="127.0.0.1"; //ftp主机地址
String ftpUser="ftp-username"; //用户名
String ftpPwd="ftp-password"; //密码
String ftpDir="/"; //ftp目录

FTPClient ftp=new FTPClient();

mySmartUpload.initialize(pageContext);
mySmartUpload.upload();

com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);

if(!myFile.isMissing()) {
Size=myFile.getSize();
FileName=myFile.getFileName();
FileExt=myFile.getFileExt();
path=myFile.getFilePathName();
suffix=FileName.substring(0,FileName.lastIndexOf('.'));
if(Size>=300000) {
out.print(”\n”);
} else {
java.util.Date date = new java.util.Date();
SimpleDateFormat formatter1 = new SimpleDateFormat(”yyyyMMddhhmmsss”);
name1=FileName.substring(FileName.indexOf(”.”),FileName.length());
newname=formatter1.format(date)+name1;
myFile.saveAs(”/mms/manager/uploads_temp/” + newname); //利用smartupload上传到jsp服务器上的一个临时文件夹内,需要根据自己的环境进行设置。
}

try {
ftp.connect(ftpHostname);
ftp.login(ftpUser,ftpPwd);
ftp.changeWorkingDirectory(ftpDir);
ftp.setFileType(FTP.BINARY_FILE_TYPE); //以BINARY格式传送文件
Fnewname=”C:\\Tomcat\\webapps\\ROOT\\mms\\manager\\uploads_temp\\”+newname+”"; //这里需要给出的是文件所在本地机器的根目录路径,也就是myFile.saveAs的路径

FileInputStream f_in=new FileInputStream(Fnewname);
ftp.storeFile(newname,f_in); //存储文件到ftp的/file目录中。
f_in.close();
} catch(Exception e) {
e.printStackTrace();
}
//删除临时上传到程序所在服务器的文件,保证空间的合理利用。
String dir = “mms/manager/uploads_temp”; //需要根据目录的设置来修改
String s_direct = getServletConfig().getServletContext().getRealPath(dir);
java.io.File f = new java.io.File(”"+s_direct+”/”+newname+”");
f.delete();
}
%>

分类: 程序设计 标签:

getOutputStream() has already been called for this response

2009年9月3日 root 没有评论

tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),
没有妥善处理好的原因。
具体的原因就是
在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
有一段这样的代码
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
response.getOutputStream()相冲突的!所以会出现以上这个异常。

然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那样–
将jsp内的所有空格和回车符号所有都删除掉),

在使用完输出流以后调用以下两行代码即可:
out.clear();
out = pageContext.pushBody();

最后这里是一个输出彩色验证码例子(这样的例子几乎随处可见)
imag.jsp

<%@ page import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%@ page import="java.io.OutputStream" %>
<%!
Color getRandColor(int fc,int bc){
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
%>
<%
try{
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
OutputStream os=response.getOutputStream();
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);

g.setFont(new Font("Times New Roman",Font.PLAIN,18));
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
String sRand="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(rand,13*i+6,16);
}
session.setAttribute("rand",sRand);
g.dispose();

ImageIO.write(image, "JPEG",os);
os.flush();
os.close();
os=null;
response.flushBuffer();
out.clear();
out = pageContext.pushBody();
}
catch(IllegalStateException e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}%>

分类: 茶余饭后 标签:

给Tomcat,Apache配置gzip压缩(HTTP压缩)功能

2009年9月2日 root 没有评论

背景:
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人

一,对于Tomcat5.0以后的版本是支持对输出内容进行压缩的. 使用的是gzip压缩格式

下面是tomcat5.5.20 中的$tomcat_home$/conf/server.xml的原内容

1 < Connector port ="80" maxHttpHeaderSize ="8192"
2 maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
3 enableLookups ="false" redirectPort ="8443" acceptCount ="100"
4 connectionTimeout ="20000" disableUploadTimeout ="true" URIEncoding ="utf-8" />
5
7
8

从上面的第8行内容可以看出,要使用gzip压缩功能,你可以在Connector实例中加上如下属性即可
1) compression=”on” 打开压缩功能
2) compressionMinSize=”2048″ 启用压缩的输出内容大小,这里面默认为2KB
3) noCompressionUserAgents=”gozilla, traviata” 对于以下的浏览器,不启用压缩
4) compressableMimeType=”text/html,text/xml” 压缩类型

我这里的配置内容为:

1 2 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
3 enableLookups="false" redirectPort="8443" acceptCount="100"
4 connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="utf-8"
5 compression="on"
6 compressionMinSize="2048"
7 noCompressionUserAgents="gozilla, traviata"
8 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
9
11
12
19

ps:对于某些文本文件比如:log、txt等文件,我们也可以让服务器采用gzip压缩传输,修改conf目录下web.xml,添加


log
text/plain

等,就可以指定压缩传输了。通常情况下,压缩传输能大幅度提高展示速度。

二,对于Apache而言,有两种情况
1)针对Apache2.0之前的版本,它原本是不支持的,不过可以通过添加第三方的module_gzip模块来启用
2)针对Apache2.0及之后的版本,Apache提供支持, 不过不叫gzip,而叫mod_deflate
下面就对Apache2.0及之后的版本作一个说明
1) 去掉#LoadModule headers_module modules/mod_headers.so前面的注释#,
2) 添加LoadModule deflate_module modules/mod_deflate.so
3) 在VirtualHost中添加
1
2 SetOutputFilter DEFLATE
3 BrowserMatch ^Mozilla/4 gzip-only-text/html
4 BrowserMatch ^Mozilla/4\.0[678] no-gzip
5 BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
6 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
7 Header append Vary User-Agent env=!dont-vary
8

9

我这里面有一个完整的演示
1# 加载deflate模块
2LoadModule headers_module modules/mod_headers.so
3LoadModule deflate_module modules/mod_deflate.so
4
5 DocumentRoot f:/apacheTest
6
7 SetOutputFilter DEFLATE
8 BrowserMatch ^Mozilla/4 gzip-only-text/html
9 BrowserMatch ^Mozilla/4\.0[678] no-gzip
10 BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
11 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
12 Header append Vary User-Agent env=!dont-vary
13

14

分类: 茶余饭后 标签:

忙乱了一阵子终于有点时间更新自己的博客了!

2009年8月29日 root 没有评论

最近一段时间可忙死了,公司网站改版,程序重新设计了下。现在的界面跟以前是完全不一样了,现在的美工还可以,是我工作三年来第一次遇见这么好的美工。以前遇到的一些美工做的东西太差了。现在是美工做好页面,切页面和程序都是我负责,可把我累坏了,连更新博客的时间都没有了!不过值得庆幸的是,这次网站改版自己比较满意,自己收获也不小。
以后应该是可以稍微轻松点了,以后研究下如何推广网站,把重点放在网站推广方面。
人太累了,也就变懒了,就写到这里吧。

分类: 茶余饭后 标签:

jQuery插件Add2Cart添加到购物车实现JS动态提示添加到购物车效果

2009年8月5日 root 没有评论

经常看到在一些购物类网站提供把产品添加到购物车的动态添加提示效果,把产品添加到购物车的提示效果实质是实现一个把产品原图大小的图片添加到购物车图片上的动画,增加一个产品原图具有阴影效果的图片放在购物车上,jQuery插件Add2Card可实现添加到购物车功能,具体大家可查看一下演示:
下载:add2card-demo

分类: 茶余饭后 标签:

java UTF-8转换GB2312

2009年8月5日 root 没有评论

Java则采用了平台无关的UNICODE,Java从一个byte流中读取一个字符串时,将把平台 相关的byte转变为平台无关的Unicode字符串。在输出时Java将把Unicode字符串转变为平台相关的byte流,如果某个Unicode字 符在某个平台上不存在,将会输出一个’?'。
GB2312编码中一个汉字是16位的,而UTF8中一个汉字却是24位的。
如果发出页面采用了UTF-8的编码,怎样实现转换到gb2312?

private String utf8Togb2312(String str){
StringBuffer sb = new StringBuffer();
for(int i=0; i char c = str.charAt(i);
switch (c) {
case '+':
sb.append(' ');
break;
case '%':
try {
sb.append((char)Integer.parseInt(
str.substring(i+1,i+3),16));
}
catch (NumberFormatException e) {
throw new IllegalArgumentException();
}
i += 2;
break;
default:
sb.append(c);
break;
}
}
// Undo conversion to external encoding
String result = sb.toString();
String res=null;
try{
byte[] inputBytes = result.getBytes("8859_1");
res= new String(inputBytes,"UTF-8");
}
catch(Exception e){}
return res;
}

分类: 茶余饭后 标签:

APE格式音乐文件

2009年7月28日 root 没有评论

一般来说,APE的音质可以和CD音质划上等号。有人曾经把CD转换成APE,然后再转回成CD。经过对比后发觉前后的CD WAVE文件的MD5值居然是相同的。这也从一定程度上说明了其无损压缩的性质。相信比CD体积小一半的APE格式,将会是音乐发烧友收藏的第一选择!
APE是目前流行的数字音乐文件格式之一。与MP3这类有损压缩方式不同,APE是一种无损压缩音频技术,也就是说当你将从音频CD上读取的音频数据文件压缩成APE格式后,你还可以再将APE格式的文件还原,而还原后的音频文件与压缩前的一模一样,没有任何损失。APE的文件大小大概为CD的一半,但是随着宽带的普及,APE格式受到了许多音乐爱好者的喜爱,特别是对于希望通过网络传输音频CD的朋友来说,APE可以帮助他们节约大量的资源。

分类: 桌面应用 标签:

Java获得汉字的首写字母

2009年7月25日 root 2 条评论


package cn.showtrue.tools;

public class Letters {
//字母Z使用了两个标签,这里有27个值
//i, u, v都不做声母, 跟随前面的字母
private static char[] chartable =
{
'啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈', '哈',
'击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然',
'撒', '塌', '塌', '塌', '挖', '昔', '压', '匝', '座'
};

private static char[] alphatable =
{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
};

private static int[] table = new int[27];

//主函数,输入字符,得到他的声母,
//英文字母返回对应的大写字母
//其他非简体汉字返回 '0'

public static char Char2Alpha(char ch){
if (ch >= 'a' && ch <= 'z')
return (char) (ch - 'a' + 'A');
if (ch >= 'A' && ch <= 'Z')
return ch;
int gb = gbValue(ch);
if (gb < table[0])
return '0';
int i;
for (i = 0; i < 26; ++i){
if (match(i, gb)) break;
}
if (i >= 26)
return '0';
else
return alphatable[i];
}

//根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串
public static String getFirstLetter(String SourceStr){
for (int i = 0; i < 27; ++i) {
table[i] = gbValue(chartable[i]);
}
String Result = "";
int StrLength = SourceStr.length();
int i;
try{
for (i = 0; i < StrLength; i++){
Result += Char2Alpha(SourceStr.charAt(i));
}
} catch (Exception e){
Result = "";
}
return Result;
}

private static boolean match(int i, int gb){
if (gb < table[i])
return false;
int j = i + 1;
//字母Z使用了两个标签
while (j < 26 && (table[j] == table[i])) ++j;
if (j == 26)
return gb <= table[j];
else
return gb < table[j];
}

//取出汉字的编码
private static int gbValue(char ch){
String str = new String();
str += ch;
try{
byte[] bytes = str.getBytes("GB2312");
if (bytes.length < 2)
return 0;
return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
} catch (Exception e){
return 0;
}
}

public static void main(String[] args){
System.out.println(Letters.getFirstLetter("简单"));
return;
}
}

经测试,对简体中文有效,繁体就会出问题。

分类: 程序设计 标签:

Oracle查询结果按指定顺序排序方法

2009年7月24日 root 没有评论

select id,g_name from shop_goods where id in(6895,6592,6589) order by DECODE(id,’6895′,’1′,’6592′,’2′,’6589′,’3′,id)

分类: 程序设计 标签:

Java解析JSON的方法

2009年7月24日 root 没有评论
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.HashMap;
import java.util.Map;
 
import org.json.JSONException;
import org.json.JSONObject;
 
public class Test {
 
    public static void main(String[] args) throws JSONException {
        String json = "{\"name\":\"reiz\"}";
        JSONObject jsonObj = new JSONObject(json);
        String name = jsonObj.getString("name");
 
        jsonObj.put("initial", name.substring(0, 1).toUpperCase());
 
        String[] likes = new String[] { "JavaScript", "Skiing", "Apple Pie" };
        jsonObj.put("likes", likes);
 
        Map <String, String> ingredients = new HashMap <String, String>();
        ingredients.put("apples", "3kg");
        ingredients.put("sugar", "1kg");
        ingredients.put("pastry", "2.4kg");
        ingredients.put("bestEaten", "outdoors");
        jsonObj.put("ingredients", ingredients);
        System.out.println(jsonObj);
 
        System.out.println(jsonObj);
    }
}

json

分类: 茶余饭后 标签: