[代码] FileAction.java
| net.oschina.action; |
002 |
003 | import java.io.*; |
004 |
005 | import org.apache.commons.io.FilenameUtils; |
006 | import org.apache.commons.io.IOUtils; |
007 | import org.apache.commons.lang.StringUtils; |
008 |
009 | import net.oschina.beans.File; |
010 | import net.oschina.beans.User; |
011 | import net.oschina.service.StorageService; |
012 | import net.oschina.toolbox.LinkTool; |
013 | import my.mvc.Annotation; |
014 | import my.mvc.RequestContext; |
015 | import my.util.Multimedia; |
016 |
017 | /** |
018 | * 文件库 |
019 | * @author Winter Lau |
020 | * @date 2010-7-4 下午01:35:12 |
021 | */ |
022 | public class FileAction { |
023 | |
024 | public final static long MAX_FILE_SIZE = 2 * 1024 * 1024 ; |
025 |
026 | /** |
027 | * 文件下载 |
028 | * @param ctx |
029 | * @throws IOException |
030 | */ |
031 | public void download(RequestContext ctx) throws IOException { |
032 | if (ctx.isRobot()){ |
033 | ctx.forbidden(); |
034 | return ; |
035 | } |
036 | |
037 | long id = ctx.id(); |
038 | File bean = File.INSTANCE.Get(id); |
039 | if (bean == null ){ |
040 | ctx.not_found(); |
041 | return ; |
042 | } |
043 |
044 | String f_ident = ctx.param( "fn" , "" ); |
045 | if (id>= 100 && !StringUtils.equals(f_ident, bean.getIdent())){ |
046 | ctx.not_found(); |
047 | return ; |
048 | } |
049 | |
050 | // 检查下载权限 |
051 | if (bean.IsLoginRequired() && ctx.user()== null ){ |
052 | StringBuilder login = new StringBuilder(LinkTool.home( "home/login?goto_page=" )); |
053 | login.append(LinkTool.encode_url(LinkTool.action( "file/download?id=" +bean.getId()+ "&fn=" +bean.getIdent()))); |
054 | ctx.redirect(login.toString()); |
055 | return ; |
056 | } |
057 | |
058 | FileInputStream fis = null ; |
059 | try { |
060 | java.io.File file = StorageService.FILES.readFile(bean.getPath()); |
061 | fis = new FileInputStream(file); |
062 | //设置 content-type |
063 | ctx.response().setContentLength(( int )file.length()); |
064 | String ext = FilenameUtils.getExtension(bean.getPath()); |
065 | String mine_type = Multimedia.mime_types.get(ext); |
066 | if (mine_type != null ) |
067 | ctx.response().setContentType(mine_type); |
068 | String ua = ctx.header( "user-agent" ); |
069 | if (ua != null && ua.indexOf( "Firefox" )>= 0 ) |
070 | ctx.header( "Content-Disposition" , "attachment; filename*=\"utf8''" + |
071 | LinkTool.encode_url(bean.getName())+ "." +ext+ "\"" ); |
072 | else |
073 | ctx.header( "Content-Disposition" , "attachment; filename=" + |
074 | LinkTool.encode_url(bean.getName()+ "." +ext)); |
075 | IOUtils.copy(fis, ctx.response().getOutputStream()); |
076 | bean.IncDownloadCount( 1 ); |
077 | //}catch(FileNotFoundException e){ |
078 | // ctx.not_found(); |
079 | } finally { |
080 | IOUtils.closeQuietly(fis); |
081 | } |
082 | } |
083 | |
084 | /** |
085 | * 文件上传 |
086 | * @param ctx |
087 | * @throws IOException |
088 | */ |
089 | @Annotation .UserRoleRequired(role=User.ROLE_EDITOR) |
090 | public void upload(RequestContext ctx) throws IOException { |
091 | File form = ctx.form(File. class ); |
092 | if (StringUtils.isBlank(form.getName())) |
093 | throw ctx.error( "file_name_empty" ); |
094 | java.io.File file = ctx.file( "file" ); |
095 | if (file == null ) |
096 | throw ctx.error( "file_empty" ); |
097 | if (!File.IsLegalFile(file.getName())) |
098 | throw ctx.error( "file_illegal" ); |
099 | String the_path = form.getUrl(); |
100 | //判断文件是否存在 |
101 | if (StringUtils.isNotBlank(the_path) && StorageService.FILES.exist(the_path)) |
102 | throw ctx.error( "file_exists" , the_path); |
103 | String uri = StringUtils.isBlank(the_path)? |
104 | StorageService.FILES.save(file):StorageService.FILES.save(file,the_path); //文件存储 |
105 | form.setSize(file.length()); |
106 | form.setUrl(uri); |
107 | form.setPath(uri); |
108 | form.setUser(ctx.user().getId()); |
109 | form.setDl_count( 0 ); |
110 | form.Save(); |
111 | throw ctx.error( "file_upload_ok" , |
112 | LinkTool.action( "file/download?id=" +form.getId()+ "&fn=" +form.getIdent())); |
113 | } |
114 |
115 | /** |
116 | * 文件修改 |
117 | * @param ctx |
118 | * @throws IOException |
119 | */ |
120 | @Annotation .UserRoleRequired(role=User.ROLE_EDITOR) |
121 | public void edit(RequestContext ctx) throws IOException { |
122 | File form = ctx.form(File. class ); |
123 | if (StringUtils.isBlank(form.getName())) |
124 | throw ctx.error( "file_name_empty" ); |
125 | File bean = File.INSTANCE.Get(form.getId()); |
126 | java.io.File pic = ctx.file( "file" ); |
127 | if (pic != null ){ |
128 | if (!File.IsLegalFile(pic.getName())) |
129 | throw ctx.error( "file_illegal" ); |
130 | bean.setSize(pic.length()); |
131 | StorageService.FILES.save(pic, bean.getPath()); //文件存储 |
132 | } |
133 | bean.setName(form.getName()); |
134 | bean.setDetail(form.getDetail()); |
135 | bean.setOptions(form.getOptions()); |
136 | bean.Update(); |
137 | throw ctx.error( "file_edit_ok" ); |
138 | } |
139 |
140 | /** |
141 | * 文件删除 |
142 | * @param ctx |
143 | * @throws IOException |
144 | */ |
145 | @Annotation .UserRoleRequired(role=User.ROLE_ADMIN) |
146 | public void delete(RequestContext ctx) throws IOException { |
147 | long id = ctx.id(); |
148 | File file = File.INSTANCE.Get(id); |
149 | if (file != null ){ |
150 | StorageService.FILES.delete(file.getPath()); |
151 | file.Delete(); |
152 | } |
153 | } |
154 |
155 | } |