今天在做项目的时候,突然要求做一个文件上传程序,下面就简单的总结一下。
首先写一个简单的文件上传jsp页面。
uploadFile.jsp
<form id="form1" method="post" action="files/upload" <span style="color:#FF6666;">enctype="multipart/form-data"</span>>
<tr>
<td width="25%" align="right">上传文件:</td>
<td><input id="file" type="file" NAME="file" style="width:300px;"></td>
</tr>
<tr align="center" valign="middle">
<td height="60" colspan="2"><input type="submit" ID="BtnOK" value="确认上传"></td>
</tr>
</form>
表单 method 属性应该设置为 POST 方法,不能使用 GET 方法。
表单 enctype 属性应该设置为 multipart/form-data。
接下来就是写我们controller了。
FileController.java
@Path("files")
public class FileController {
//设置文件最大限制
private static final long MAX_FILE_SIZE = 8 * 1024 * 1024;
@Get("upload")
public Object upload(){
return "file/upload";
}
@Post("onUpload") /这里必须采用post方法
@HttpFeatures(contentType = "application/json", charset = "utf-8")
public Object onUpload(@Param("file") MultipartFile[] file, Invocation inv) throws Exception {
JSONObject result = new JSONObject();
if(file == null || file.length == 0){
result.put("success",false);
result.put("message","file empty");
}else {
JSONArray uploadFiles = new JSONArray();
for( MultipartFile f : file){
JSONObject jsonfile = new JSONObject();
jsonfile.put("filename", f.getOriginalFilename());
net.sf.json.JSONObject upResult = FileTool.uploadPic(f, MAX_FILE_SIZE);
if(upResult.getInt("code") == JSONTool.success){
jsonfile.put("uploadFileUrl",upResult.getString("message"));
}else{
throw new Exception(upResult.getString("message"));
}
uploadFiles.put(jsonfile);
}
result.put("success", true);
result.put("message", "ok");
result.put("uploadFiles", uploadFiles);
}
return result.toString();
}
}
当我们接收到文件以后我们就可以把它存起来了
FileTool.java
public static JSONObject uploadPic(MultipartFile file, long maxPicSize) throws IOException {
//首先判断文件的大小
if (file == null || file.getSize() == 0) {
return JSONTool.getReturnJSON(JSONTool.fail, "请重新选择要上传的文件。");
}
if (file.getSize() > maxPicSize) {
return JSONTool.getReturnJSON(JSONTool.fail, "文件大小请不要超过" + maxPicSize / MILLION + "M。");
}
//获得文件的名称
String filename = file.getOriginalFilename();
//获得文件的扩展名称
String extensionName = FileTool.getExtensionName(filename).toLowerCase();
//判断文件是否是你需要的支持的类型
if (StringUtils.isNotBlank(extensionName)
&& !(extensionName.equals("jpg") || extensionName.equals("jpeg") || extensionName.equals("png")
|| extensionName.equals("bmp") || extensionName.equals("gif") || extensionName.equals("pdf"))) {
return JSONTool.getReturnJSON(JSONTool.fail, "文件类型不是JPEG,PNG,BMP,PDF或者GIF。");
}
//接下来就是把文件存起来了
String DISK_PATH = "/home/work/data/cashpay-admin/creditMaintain/";
// 如果DISK_PATH路径不存在,则创建
File uploadFilePath = new File(DISK_PATH);
if (uploadFilePath.exists() == false) {
uploadFilePath.mkdirs();
}
// 生成全局唯一的id
String guid = GuidCreator.createGuid();
String localUrl = DISK_PATH + guid + "_" + file.getOriginalFilename();
boolean saveResult = AppLoadService.saveFile(localUrl, file);
if (!saveResult) {
return JSONTool.getReturnJSON(JSONTool.fail, "文件上传出错。");
}
JSONObject result = JSONTool.getReturnJSON(JSONTool.success, localUrl);
result.put("fileName", filename);
return result;
}
下面就是把MultipartFile存到磁盘上去
public class AppLoadService {
public static boolean saveFile(String localUrl, MultipartFile file) throws IOException {
File realFile = new File(localUrl);
OutputStream outputstream = null;
InputStream inputstream = null;
try {
inputstream = file.getInputStream();
outputstream = new FileOutputStream(realFile);
byte[] buffer = new byte[1024 * 5];
int byteRead = -1;
while ((byteRead = (inputstream.read(buffer))) != -1) {
outputstream.write(buffer, 0, byteRead);
}
realFile.setExecutable(false);
return true;
} catch (Exception e) {
return false;
} finally {
if (outputstream != null) {
outputstream.flush();
outputstream.close();
}
if (inputstream != null) {
inputstream.close();
}
}
}
}