springmvc web网站开发上传视频到远程服务器解决方案!近期在给学校做官方网站设计时,有一个业务需求是,后台要增加一个视频管理模块,管理员在后台可以把本地硬盘剪辑好的视频文件,上传到远程服务器里,然后在网页前端页面里供访客浏览。
1,先说一下,解决思路。和之前一样,既然是上传多媒体文件,借助于之前在培训班里的学习经验,使用org.springframework.web.multipart.MultipartFile;这个插件,是可以实现该功能,就是速度这块快不快,得看您的网络带宽,和服务器的网络带宽了。当然是带宽越高速度越快了,包括服务器的cpu核心频率,和内存大小。你懂的。
2,下面就是说一下代码的实现,和一些基础的配置参数设置情况。
先贴代码,供大家借鉴。下面是我自己给公司写的上传视频到远程服务器的controller,控制器源码。
package com.web.controller;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.web.bean.Proimage;
import com.web.bean.ResponseResult;
import com.web.util.CreateName;
@Controller
@RequestMapping({ "/uploadvideo" })
public class UploadVideoController {
/**
* 上传校区视频接口,
* @param request
* @param peitu
* @return
*/
@RequestMapping("/uploadXiaoquVideo")
@ResponseBody
public ResponseResult<Proimage> uploadXiaoquVideoSrc(HttpServletRequest request,
@RequestParam("xiaoquvideosrcfile") MultipartFile peitu){
ResponseResult<Proimage> rr = new ResponseResult<Proimage>();
try {
byte[] bytes = null;
// www/www/ftpusergrzx/newspeitu/
//存储在本地硬盘里的所有的视频文件。
String uploadDir = "d:\\xiaoquvideosource\\";
String fileRrealName = peitu.getOriginalFilename();
//使用系统时间戳产生了一个名字。+原始文件的后缀名,组合的一个新的文件名字。
// long time = System.currentTimeMillis();
// String t = String.valueOf(time / 1000L);
//文件的名字,可以使用代码创造的名字。
String newName = CreateName.getInstance().getNewName();
String fileName = String.valueOf(newName) + fileRrealName.substring(fileRrealName.lastIndexOf("."));
String filePath = String.valueOf(uploadDir) + fileName;
// 给后端发布人员看见的显示图片的路径地址。这是一个相对地址。不是物理路径。
String xianshisrc = "/xiaoquvideosrcurl/" + fileName;
BufferedOutputStream bos = null;
FileOutputStream fos = null;
try {
bytes = peitu.getBytes();
File temp = new File(filePath);
if (!temp.exists())
temp.createNewFile();
fos = new FileOutputStream(temp);
bos = new BufferedOutputStream(fos);
bos.write(bytes);
rr.setState(Integer.valueOf(1));
rr.setMessage("校区视频上传成功");
Proimage pi = new Proimage();
pi.setImgurl(xianshisrc);
rr.setData(pi);
return rr;
} catch (Exception e) {
e.printStackTrace();
rr.setState(Integer.valueOf(0));
rr.setMessage("请重试");
return rr;
} finally {
if (bos != null)
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null)
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
rr.setState(Integer.valueOf(0));
rr.setMessage("服务器异常请重试");
return rr;
}
}
/**
* 上传成绩配图接口
* @param request
* @param peitu
* @return
*/
@RequestMapping("/uploadVideoSrc")
@ResponseBody
public ResponseResult<Proimage> uploadVideoSrc(HttpServletRequest request,
@RequestParam("videosrcfile") MultipartFile peitu) {
ResponseResult<Proimage> rr = new ResponseResult<Proimage>();
try {
byte[] bytes = null;
// www/www/ftpusergrzx/newspeitu/
//存储在本地硬盘里的所有的视频文件。
String uploadDir = "d:\\videosource\\";
String fileRrealName = peitu.getOriginalFilename();
//使用系统时间戳产生了一个名字。+原始文件的后缀名,组合的一个新的文件名字。
// long time = System.currentTimeMillis();
// String t = String.valueOf(time / 1000L);
//文件的名字,可以使用代码创造的名字。
String newName = CreateName.getInstance().getNewName();
String fileName = String.valueOf(newName) + fileRrealName.substring(fileRrealName.lastIndexOf("."));
String filePath = String.valueOf(uploadDir) + fileName;
// 给后端发布人员看见的显示图片的路径地址。这是一个相对地址。不是物理路径。
String xianshisrc = "/videosrcurl/" + fileName;
BufferedOutputStream bos = null;
FileOutputStream fos = null;
try {
bytes = peitu.getBytes();
File temp = new File(filePath);
if (!temp.exists())
temp.createNewFile();
fos = new FileOutputStream(temp);
bos = new BufferedOutputStream(fos);
bos.write(bytes);
rr.setState(Integer.valueOf(1));
rr.setMessage("视频上传成功");
Proimage pi = new Proimage();
pi.setImgurl(xianshisrc);
rr.setData(pi);
return rr;
} catch (Exception e) {
e.printStackTrace();
rr.setState(Integer.valueOf(0));
rr.setMessage("请重试");
return rr;
} finally {
if (bos != null)
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null)
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
rr.setState(Integer.valueOf(0));
rr.setMessage("服务器异常请重试");
return rr;
}
}
}
如图,在代码里面,上传后,需要给文件起一个名字,我使用的是:使用系统时间戳产生了一个名字。+原始文件的后缀名,组合的一个新的文件名字。你也可以使用其他的起名方案。
如图,这是上传到服务器后的视频文件名字,格式我使用的都是mp4格式的。
下面发一下,配置的参数情况。
修改spring-mvc.xml配置文件里的参数,最大上传文件的容积,改成你预估的大小即可。我写的是允许上传2G左右的大小的文件。
补充:这个配置参数,会影响整个上传接口!只要你是调用了multipartReslver插件,都会被他影响到的。不仅仅是视频哦,图片,等都是它来管控着的。
末尾说一下,亲测的上传和播放效果。
首先说一下,服务器的配置参数:2核心,4G内存,40G硬盘。带宽峰值1M,
本地提交了1G多的视频,大概使用了1分钟左右,70秒左右,完成了上传操作。还算马马虎虎。如果带宽购买提升一下,速度会更快,实际在前端页面内播放的时候,视频是高清的720p的,播放会出现卡顿,(因为视频需要下载,下载的时候,没有那么快了,就会出现卡顿,)需要等待才能完成下载,下载完成后,播放是流畅的。
没过多久,就花钱提升了带宽,改成了5M带宽,下载速度提升了,但是播放的时候,依然会偶尔卡顿,所以,提醒大家考虑好,到底要不要使用这种web服务器的带宽,做视频播放的架构。
网友们推荐的解决方案是,购买CDN,(中央节点加速器),那种另外算费用了,我没有测试过。
以上内容就是本次为大家分享的,本地上传视频到远程服务器的全部内容。