[代码]FileAction.java
| net.oschina.action; |
002 |
003 | importjava.io.*; |
004 |
005 | importorg.apache.commons.io.FilenameUtils; |
006 | importorg.apache.commons.io.IOUtils; |
007 | importorg.apache.commons.lang.StringUtils; |
008 |
009 | importnet.oschina.beans.File; |
010 | importnet.oschina.beans.User; |
011 | importnet.oschina.service.StorageService; |
012 | importnet.oschina.toolbox.LinkTool; |
013 | importmy.mvc.Annotation; |
014 | importmy.mvc.RequestContext; |
015 | importmy.util.Multimedia; |
016 |
017 | /** |
018 | * 文件库 |
019 | * @author Winter Lau |
020 | * @date 2010-7-4 下午01:35:12 |
021 | */ |
022 | publicclassFileAction { |
023 | |
024 | publicfinalstaticlongMAX_FILE_SIZE =2*1024*1024; |
025 |
026 | /** |
027 | * 文件下载 |
028 | * @param ctx |
029 | * @throws IOException |
030 | */ |
031 | publicvoiddownload(RequestContext ctx)throwsIOException { |
032 | if(ctx.isRobot()){ |
033 | ctx.forbidden(); |
034 | return; |
035 | } |
036 | |
037 | longid = 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 =newStringBuilder(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 =newFileInputStream(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 | publicvoidupload(RequestContext ctx)throwsIOException { |
091 | File form = ctx.form(File.class); |
092 | if(StringUtils.isBlank(form.getName())) |
093 | throwctx.error("file_name_empty"); |
094 | java.io.File file = ctx.file("file"); |
095 | if(file ==null) |
096 | throwctx.error("file_empty"); |
097 | if(!File.IsLegalFile(file.getName())) |
098 | throwctx.error("file_illegal"); |
099 | String the_path = form.getUrl(); |
100 | //判断文件是否存在 |
101 | if(StringUtils.isNotBlank(the_path) && StorageService.FILES.exist(the_path)) |
102 | throwctx.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 | throwctx.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 | publicvoidedit(RequestContext ctx)throwsIOException { |
122 | File form = ctx.form(File.class); |
123 | if(StringUtils.isBlank(form.getName())) |
124 | throwctx.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 | throwctx.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 | throwctx.error("file_edit_ok"); |
138 | } |
139 |
140 | /** |
141 | * 文件删除 |
142 | * @param ctx |
143 | * @throws IOException |
144 | */ |
145 | @Annotation.UserRoleRequired(role=User.ROLE_ADMIN) |
146 | publicvoiddelete(RequestContext ctx)throwsIOException { |
147 | longid = 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 | } |
本文详细介绍了文件库中文件的下载、上传、编辑和删除操作,涉及权限验证、内容类型设置、文件存储和管理等关键步骤。

736

被折叠的 条评论
为什么被折叠?



