package com.tale.controller.admin;
import com.blade.ioc.annotation.Inject;
import com.blade.jdbc.core.Take;
import com.blade.jdbc.model.Paginator;
import com.blade.kit.FileKit;
import com.blade.kit.Tools;
import com.blade.mvc.annotation.Controller;
import com.blade.mvc.annotation.JSON;
import com.blade.mvc.annotation.QueryParam;
import com.blade.mvc.annotation.Route;
import com.blade.mvc.http.HttpMethod;
import com.blade.mvc.http.Request;
import com.blade.mvc.multipart.FileItem;
import com.blade.mvc.view.RestResponse;
import com.tale.controller.BaseController;
import com.tale.dto.LogActions;
import com.tale.dto.Types;
import com.tale.exception.TipException;
import com.tale.ext.Commons;
import com.tale.init.TaleConst;
import com.tale.model.Attach;
import com.tale.model.Users;
import com.tale.service.AttachService;
import com.tale.service.LogService;
import com.tale.service.SiteService;
import com.tale.utils.TaleUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 附件管理
*
* Created by biezhi on 2017/2/21.
*/
@Controller("admin/attach")
public class AttachController extends BaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(AttachController.class);
public static final String CLASSPATH = AttachController.class.getClassLoader().getResource("").getPath();
@Inject
private AttachService attachService;
@Inject
private LogService logService;
@Inject
private SiteService siteService;
/**
* 附件页面
*
* @param request
* @param page
* @param limit
* @return
*/
@Route(value = "", method = HttpMethod.GET)
public String index(Request request, @QueryParam(value = "page", defaultValue = "1") int page,
@QueryParam(value = "limit", defaultValue = "12") int limit) {
Paginator<Attach> attachPaginator = attachService.getAttachs(new Take(Attach.class).page(page, limit, "id desc"));
request.attribute("attachs", attachPaginator);
request.attribute(Types.ATTACH_URL, Commons.site_option(Types.ATTACH_URL, Commons.site_url()));
request.attribute("max_file_size", TaleConst.MAX_FILE_SIZE / 1024);
return "admin/attach";
}
/**
* 上传文件接口
*
* 返回格式
* @param request
* @return
*/
@Route(value = "upload", method = HttpMethod.POST)
@JSON
public RestResponse upload(Request request) {
LOGGER.info("UPLOAD DIR = {}", TaleUtils.upDir);
Users users = this.user();
Integer uid = users.getUid();
Map<String, FileItem> fileItemMap = request.fileItems();
Collection<FileItem> fileItems = fileItemMap.values();
List<Attach> errorFiles = new ArrayList<>();
List<Attach> urls = new ArrayList<>();
try {
fileItems.forEach((FileItem f) -> {
String fname = f.fileName();
if(f.file().length() / 1024 <= TaleConst.MAX_FILE_SIZE){
String fkey = TaleUtils.getFileKey(fname);
String ftype = TaleUtils.isImage(f.file()) ? Types.IMAGE : Types.FILE;
String filePath = TaleUtils.upDir + fkey;
File file = new File(filePath);
try {
Tools.copyFileUsingFileChannels(f.file(), file);
f.file().delete();
} catch (IOException e) {
e.printStackTrace();
}
Attach attach = attachService.save(fname, fkey, ftype, uid);
urls.add(attach);
siteService.cleanCache(Types.C_STATISTICS);
} else {
errorFiles.add(new Attach(fname));
}
});
if(errorFiles.size() > 0){
RestResponse restResponse = new RestResponse();
restResponse.setSuccess(false);
restResponse.setPayload(errorFiles);
return restResponse;
}
return RestResponse.ok(urls);
} catch (Exception e) {
String msg = "文件上传失败";
if(e instanceof TipException){
msg = e.getMessage();
} else {
LOGGER.error(msg, e);
}
return RestResponse.fail(msg);
}
}
@Route(value = "delete")
@JSON
public RestResponse delete(@QueryParam Integer id, Request request) {
try {
Attach attach = attachService.byId(id);
if (null == attach) return RestResponse.fail("不存在该附件");
attachService.delete(id);
siteService.cleanCache(Types.C_STATISTICS);
String upDir = CLASSPATH.substring(0, CLASSPATH.length() - 1);
FileKit.delete(upDir + attach.getFkey());
logService.save(LogActions.DEL_ATTACH, attach.getFkey(), request.address(), this.getUid());
} catch (Exception e) {
String msg = "附件删除失败";
if (e instanceof TipException) msg = e.getMessage();
else LOGGER.error(msg, e);
return RestResponse.fail(msg);
}
return RestResponse.ok();
}
}