一 Android端代码
package com.xky.recall.network; import com.xky.recall.utils.LogUtils; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.UUID; /** * @author weijinsong * @date 2018/6/4. */ public class UploadUtils { private static final String TAG = "uploadFile"; private static final int TIME_OUT = 10 * 1000;//超时时间 private static final String CHARSET = "utf-8";//设置编码 /** * android上传文件到服务器 * * @param file 需要上传的文件 * @param url 请求的url * @return 返回响应的内容 */ public static String uploadImage(URL url, File file, String userId, String userAccount, String albumName) { String result = "error"; String BOUNDARY = UUID.randomUUID().toString();//边界标识 随机生成 String PREFIX = "--", LINE_END = "\r\n"; String CONTENT_TYPE = "multipart/form-data";//内容类型 try { // URL url = new URL(RequestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(TIME_OUT); conn.setConnectTimeout(TIME_OUT); conn.setDoInput(true);//允许输入流 conn.setDoOutput(true);//允许输出流 conn.setUseCaches(false);//不允许使用缓存 conn.setRequestMethod("POST");//请求方式 conn.setRequestProperty("Charset", CHARSET);//设置编码 conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); conn.connect(); if (file.exists()) { //当文件不为空,把文件包装并且上传 DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); /** * set user account */ dos.writeBytes(PREFIX + BOUNDARY + LINE_END); dos.writeBytes("Content-Disposition: form-data; " + "name=\"userId\"" + LINE_END); dos.writeBytes(LINE_END); dos.writeBytes( URLEncoder.encode(userId,"utf-8") + LINE_END); /** * set user account */ dos.writeBytes(PREFIX + BOUNDARY + LINE_END); dos.writeBytes("Content-Disposition: form-data; " + "name=\"userAccount\"" + LINE_END); dos.writeBytes(LINE_END); dos.writeBytes( URLEncoder.encode(userAccount,"utf-8") + LINE_END); /** * set album name */ dos.writeBytes(PREFIX + BOUNDARY + LINE_END); dos.writeBytes("Content-Disposition: form-data; " + "name=\"albumName\"" + LINE_END); dos.writeBytes(LINE_END); dos.writeBytes( URLEncoder.encode(albumName,"utf-8") + LINE_END); dos.writeBytes(PREFIX + BOUNDARY + LINE_END); dos.writeBytes("Content-Disposition: form-data; " + "name=\"recall\";filename=\"" + file.getName() + "\"" + LINE_END); dos.writeBytes(LINE_END); FileInputStream is = new FileInputStream(file); byte[] bytes = new byte[1024]; int len = -1; while ((len = is.read(bytes)) != -1) { dos.write(bytes, 0, len); } is.close(); dos.write(LINE_END.getBytes()); byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes(); dos.write(end_data); dos.flush(); /* * 获取响应码 200=成功 * 当响应成功,获取响应的流 */ int res = conn.getResponseCode(); if (res == HttpURLConnection.HTTP_OK) { InputStream input = conn.getInputStream(); StringBuilder sbs = new StringBuilder(); int ss; while ((ss = input.read()) != -1) { sbs.append((char) ss); } result = sbs.toString(); } } } catch (IOException e) { e.printStackTrace(); } return result; } private static String getMIMEType(File file) { String fileName = file.getName(); if (fileName.endsWith("png") || fileName.endsWith("PNG")) { return "image/png"; } else { return "image/jpg"; } } }
二 服务器SSM代码
/**
* @function 文件上传 , @RequestParam("file") MultipartFile file
* @param user
* @param file
* @param request
* @return
*/
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public void uploadFile(User user, HttpServletRequest request,
HttpSession session, HttpServletResponse response) {
MultipartHttpServletRequest rq = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> file_list = rq.getFileMap();
String pictureName = null;
String userId = rq.getParameter("userId").toString();
String userAccount = rq.getParameter("userAccount").toString();
String albumName = rq.getParameter("albumName").toString();
boolean isStorePicture = false;
try{
//System.out.println(URLDecoder.decode(userAccount, "utf-8").toString());
userId = URLDecoder.decode(userId, "utf-8");
userAccount = URLDecoder.decode(userAccount, "utf-8");
albumName = URLDecoder.decode(albumName, "utf-8");
} catch(Exception e) {
e.printStackTrace();
}
Album album = new Album();
album.setUserId(Integer.parseInt(userId));
album.setAlbumName(albumName);
Picture picture = new Picture();
if (file_list != null && file_list.size() > 0) {
if (file_list.containsKey("recall")) {
MultipartFile file = file_list.get("recall");
if (!file.isEmpty()) {
if((album = albumService.findAlbumByAlbumNameAndUserId(album)) != null) {
picture.setAlbumId(album.getAlbumId());
pictureName = file.getName();
System.out.println(pictureName);
pictureName = file.getOriginalFilename();
picture.setPictureName(pictureName);
if(pictureService.findPictureByAlbumIdAndPictureName(picture) == null) {
isStorePicture = true;
}
}
if(isStorePicture) {
/*
* 在开发过程中,一般不会把文件路径写死在某个盘的某个路径下面 1.通过ul无法访问文件
* 2.无法匹配各个环境(开发环境、测试环境、线上运营环境)路径需求 windows/Linux 解决办法:
* 将文件存储到工程路径下面
*/
String path = request.getSession().getServletContext()
.getRealPath("/")
+ "upload/" ;
System.out.println("path = " + path);
// 判断目录是否存在,不存在则创建目录
File pFile = new File(path);
if (!pFile.exists()) {
pFile.mkdir();
}
/**
* create userAccount file
*/
path += userAccount + "/";
File userAccountFile = new File(path);
if(!userAccountFile.exists()) {
userAccountFile.mkdir();
}
/**
* create userAccount albumName file
*/
path += albumName + "/";
File albumNameFile = new File(path);
if(!albumNameFile.exists()) {
albumNameFile.mkdir();
}
String fileName = file.getOriginalFilename();
String userAvatarPath = null;
String ext = fileName.substring(fileName.lastIndexOf("."));
/*
* java随机id UUID.randomUUID() 但是存储到服务的文件名字找不到 解决办法:方法1:
* 在实际开发过程中,会单独的建一张文件上传表,保存文件的id、名字、url、大小、后缀名, 其他业务表保存文件的id
* 方法2:
* 直接在业务表里面写入文件的真实名称file.getOriginalFilename()和文件的存储位置(url
* )filePath
*
* 但是在实际开发中,把所有文件都上传到web目录下面是不可取的,因为web服务太大会影响启动,同时web又大小限制
* 实际开发中,web服务值保存一些关键同时比较小的文件(比如头像、app下载包),
* 其他文件上传到本地之后,我们会将文件上传到文件服务器
* (如fastdfs、ftp等),然后将上传后的地址保存在数据库同时删除本地文件
*/
userAvatarPath = UUID.randomUUID() + ext;
//String filePath = path + userAvatarPath;
String filePath = path + fileName;
picture.setPicturePath(userAccount + "/" + albumName + "/" + fileName);
picture.setPictureCreateDate(new Date(System.currentTimeMillis()));
picture.setPictureModifyDate(new Date(System.currentTimeMillis()));
/*
* user.setUserPortraitPath(userAvatarPath);
* user.setUserCreateDate(new
* Date(System.currentTimeMillis()));
* user.setUserModifyDate(new
* Date(System.currentTimeMillis()));
*/
try {
pictureService.addPicture(picture);
file.transferTo(new File(filePath));
session.setAttribute("newfilename", userAvatarPath);
// userService.addUser(user);
} catch (IllegalStateException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
//return "/userLogin";// redirect:/user/index
}
三 spring-mvc配置文件加入
<!-- 文件上传配置 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
<property name="maxUploadSize">
<value>524288000</value><!-- 上传文件大小限制为500M,31*1024*1024 -->
</property>
<property name="maxInMemorySize">
<value>4096</value>
</property>
</bean>