源代碼肯定不會(huì)貼給你的,思路可以說(shuō)下!
開(kāi)福網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,開(kāi)福網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為開(kāi)福1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的開(kāi)福做網(wǎng)站的公司定做!
首先,你在后臺(tái)把各格式的相互轉(zhuǎn)換函數(shù)寫(xiě)好比如,rm2flv,wav2flv,自己去掉人家的借口,找下demo代碼。
然后,做一個(gè)表單網(wǎng)頁(yè),能上傳源文件到服務(wù)器,點(diǎn)擊上傳提交任務(wù)
最后,上傳完畢,判斷文件格式(后綴),然后調(diào)用對(duì)應(yīng)的函數(shù)進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換完畢后,可以給出轉(zhuǎn)換信息,如文件大小,轉(zhuǎn)換時(shí)間,轉(zhuǎn)換后文件url地址等
完畢!
方法/步驟
1
首先這里jsp頁(yè)面的代碼 定義布局文件html的 如圖所示
這是js文件 打開(kāi)一個(gè)新子窗口和向頁(yè)面中加載視頻播放標(biāo)簽
上傳文件java代碼 獲取時(shí)間轉(zhuǎn)換成字符串作為上傳之后的文件名以及設(shè)置保存路徑和傳值到j(luò)sp頁(yè)面
這里copy代碼 將一個(gè)源文件復(fù)制到新的目錄路徑下 如圖所示
這里upload的jsp文件 用來(lái)選擇視頻文件并提交給后臺(tái)
展示舊文件名新文件名和上傳后的文件目錄路徑 并將其傳給父頁(yè)面即index.jsp
upload.jsp文件提交的代碼經(jīng)過(guò)java文件處理后通過(guò)控制轉(zhuǎn)到upload_video.jsp
代碼片段已經(jīng)貼出來(lái)了,接下來(lái)我們開(kāi)始演示界面 打開(kāi)后如圖所示 點(diǎn)擊上傳按鈕
點(diǎn)擊選擇文件 找到要上傳的視頻文件 選中后選擇打開(kāi) 然后點(diǎn)擊確定按鈕
這里就是顯示新舊文件名和文件目錄路徑的界面 點(diǎn)擊確定將文件目錄傳給父文件界面
如圖所示 目錄路徑已經(jīng)出給input中了 點(diǎn)擊播放按鈕 就會(huì)出現(xiàn)播放界面并且自動(dòng)播放了
上傳視頻?只是上傳的話,相當(dāng)于,上傳文件了
html如下
form action="MultipartTestServlet" enctype="multipart/form-data" method="post"
input type="text" name="username" /br /
input type="file" name="myfile" /br/
input type="submit" /
/form
java如下
MultipartTestServlet.java
package com.bug.servlet;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
public class MultipartTestServlet extends HttpServlet {
public MultipartTestServlet() {
super();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("gbk");
RequestContext requestContext = new ServletRequestContext(request);
if(FileUpload.isMultipartContent(requestContext)){
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File("c:/tmp/"));
ServletFileUpload upload = new ServletFileUpload(factory);
//upload.setHeaderEncoding("gbk");
upload.setSizeMax(2000000);
List items = new ArrayList();
try {
items = upload.parseRequest(request);
} catch (FileUploadException e1) {
System.out.println("文件上傳發(fā)生錯(cuò)誤" + e1.getMessage());
}
Iterator it = items.iterator();
while(it.hasNext()){
FileItem fileItem = (FileItem) it.next();
if(fileItem.isFormField()){
System.out.println(fileItem.getFieldName() + " " + fileItem.getName() + " " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));
}else{
System.out.println(fileItem.getFieldName() + " " +
fileItem.getName() + " " +
fileItem.isInMemory() + " " +
fileItem.getContentType() + " " +
fileItem.getSize());
if(fileItem.getName()!=null fileItem.getSize()!=0){
File fullFile = new File(fileItem.getName());
File newFile = new File("c:/temp/" + fullFile.getName());
try {
fileItem.write(newFile);
} catch (Exception e) {
e.printStackTrace();
}
}else{
System.out.println("文件沒(méi)有選擇 或 文件內(nèi)容為空");
}
}
}
}
}
}
web.xml中加入
servlet
servlet-nameMultipartTestServlet/servlet-name
servlet-classcom.bug.servlet.MultipartTestServlet/servlet-class
/servlet
需要的包到這三個(gè)地方下載
下載
下載
在下載
關(guān)于視頻的播放,你只能自己再去找了
其實(shí)x.avi本身也是二進(jìn)制文件,你只需要按照二進(jìn)制文件讀取方式讀取就可以了,所以不理解你這里的x.dat又是什么樣的?或者是說(shuō)輪換成文本文件?如果這樣的話你將x.avi一個(gè)字符一個(gè)字符地讀取然后用16進(jìn)制保存到x.dat中即可。
再轉(zhuǎn)換為y.avi時(shí)同理,讀取x.dat中的兩個(gè)文本字符,轉(zhuǎn)換成byte再寫(xiě)入y.avi即可。
文件上傳就是將客戶端資源,通過(guò)網(wǎng)路傳遞到服務(wù)器端。
因?yàn)槲募?shù)據(jù)比較大,必須通過(guò)文件上傳才可以完成將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)端的操作。
文件上傳的本質(zhì)就是IO流操作。
演示:文件上傳應(yīng)該如何操作?
瀏覽器端:
1.method=post 只有post才可以攜帶大數(shù)據(jù)
2.必須使用input type='file' name='f'要有name屬性
3.encType="multipart/form-data"
服務(wù)器端:
request對(duì)象是用于獲取請(qǐng)求信息。
它有一個(gè)方法 ?getInputStream(); 可以獲取一個(gè)字節(jié)輸入流,通過(guò)這個(gè)流,可以讀取到
所有的請(qǐng)求正文信息.
文件上傳原理:
瀏覽器端注意上述三件事,在服務(wù)器端通過(guò)流將數(shù)據(jù)讀取到,在對(duì)數(shù)據(jù)進(jìn)行解析.
將上傳文件內(nèi)容得到,保存在服務(wù)器端,就完成了文件上傳。
注意:在實(shí)際開(kāi)發(fā)中,不需要我們進(jìn)行數(shù)據(jù)解析,完成文件上傳。因?yàn)槲覀儠?huì)使用文件上傳的工具,它們已經(jīng)封裝好的,提供API,只要調(diào)用它們的API就可以完成文件上傳操作.我們使用的commons-fileupload,它是apache提供的一套開(kāi)源免費(fèi)的文件上傳工具。
代碼演示文件上傳的原理:
在WebRoot下新建upload1.jsp
[html]?view plain?copy
%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%
!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"
html
head
titleMy?JSP?'index.jsp'?starting?page/title
/head
body
!--?encType?默認(rèn)是application/x-www-form-urlencoded?--
form?action="${pageContext.request.contextPath?}/upload1"
method="POST"?enctype="multipart/form-data"
input?type="text"?name="content"br
input?type="file"?name="f"br?input?type="submit"
value="上傳"
/form
/body
/html
新建Upload1Servlet ?路徑:/upload1
[java]?view plain?copy
package?cn.itcast.web.servlet;
import?java.io.IOException;
import?java.io.InputStream;
import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
public?class?Upload1Servlet?extends?HttpServlet?{
public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
//?System.out.println("upload1?servlet......");
//?通過(guò)request獲取一個(gè)字節(jié)輸入流,將所有的請(qǐng)求正文信息讀取到,打印到控制臺(tái)
InputStream?is?=?request.getInputStream();
byte[]?b?=?new?byte[1024];
int?len?=?-1;
while?((len?=?is.read(b))?!=?-1)?{
System.out.println(new?String(b,?0,?len));
}
is.close();
}
public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
doGet(request,?response);
}
}
在瀏覽器端訪問(wèn)信息如下:
后臺(tái)打印正文信息如下:
文件上傳概述
實(shí)現(xiàn)web開(kāi)發(fā)中的文件上傳功能,需要完成如下二步操作:
在web頁(yè)面中添加上傳輸入項(xiàng)。
在Servlet中讀取上傳文件的數(shù)據(jù),并保存在服務(wù)器硬盤(pán)中。
如何在web頁(yè)面中添加上傳輸入項(xiàng)?
input ?type="file"標(biāo)簽用于在web頁(yè)面中添加文件上傳輸入項(xiàng),設(shè)置文件上傳輸入項(xiàng)時(shí)注意:
1、必須設(shè)置input輸入項(xiàng)的name屬性,否則瀏覽器將不會(huì)發(fā)送上傳文件的數(shù)據(jù)。
2、必須把form的encType屬性設(shè)為multipart/form-data 設(shè)置該值后,瀏覽器在上傳文件時(shí),并把文件數(shù)據(jù)附帶在http請(qǐng)求消息體內(nèi),并使用MIME協(xié)議對(duì)上傳的文件進(jìn)行描述,以方便接收方對(duì)上傳數(shù)據(jù)進(jìn)行解析和處理。
3、表單的提交方式要設(shè)置為post。
如何在Servlet中讀取文件上傳數(shù)據(jù),并保存到本地硬盤(pán)中?
Request對(duì)象提供了一個(gè)getInputStream方法,通過(guò)這個(gè)方法可以讀取到客戶端提交過(guò)來(lái)的數(shù)據(jù)。但由于用戶可能會(huì)同時(shí)上傳多個(gè)文件,在servlet端編程直接讀取上傳數(shù)據(jù),并分別解析出相應(yīng)的文件數(shù)據(jù)是一項(xiàng)非常麻煩的工作,示例。
為方便用戶處理文件上傳數(shù)據(jù),Apache 開(kāi)源組織提供了一個(gè)用來(lái)處理表單文件上傳的一個(gè)開(kāi)源組件( Commons-fileupload ),該組件性能優(yōu)異,并且其API使用極其簡(jiǎn)單,可以讓開(kāi)發(fā)人員輕松實(shí)現(xiàn)web文件上傳功能,因此在web開(kāi)發(fā)中實(shí)現(xiàn)文件上傳功能,通常使用Commons-fileupload組件實(shí)現(xiàn)。
使用Commons-fileupload組件實(shí)現(xiàn)文件上傳,需要導(dǎo)入該組件相應(yīng)支撐jar包:Commons-fileupload和commons-io。commo-io不屬于文件上傳組件的開(kāi)發(fā)jar文件,但Commons-fileupload組件從1.1版本開(kāi)始,它工作時(shí)需要commons-io包的支持。
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class ConvertVideo {
private final static String PATH = "c:\\ffmpeg\\input\\c.mp4";
public static void main(String[] args) {
if (!checkfile(PATH)) {
System.out.println(PATH + " is not file");
return;
}
if (process()) {
System.out.println("ok");
}
}
private static boolean process() {
int type = checkContentType();
boolean status = false;
if (type == 0) {
System.out.println("直接將文件轉(zhuǎn)為flv文件");
status = processFLV(PATH);// 直接將文件轉(zhuǎn)為flv文件
} else if (type == 1) {
String avifilepath = processAVI(type);
if (avifilepath == null)
return false;// avi文件沒(méi)有得到
status = processFLV(avifilepath);// 將avi轉(zhuǎn)為flv
}
return status;
}
private static int checkContentType() {
String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length())
.toLowerCase();
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if (type.equals("avi")) {
return 0;
} else if (type.equals("mpg")) {
return 0;
} else if (type.equals("wmv")) {
return 0;
} else if (type.equals("3gp")) {
return 0;
} else if (type.equals("mov")) {
return 0;
} else if (type.equals("mp4")) {
return 0;
} else if (type.equals("asf")) {
return 0;
} else if (type.equals("asx")) {
return 0;
} else if (type.equals("flv")) {
return 0;
}
// 對(duì)ffmpeg無(wú)法解析的文件格式(wmv9,rm,rmvb等),
// 可以先用別的工具(mencoder)轉(zhuǎn)換為avi(ffmpeg能解析的)格式.
else if (type.equals("wmv9")) {
return 1;
} else if (type.equals("rm")) {
return 1;
} else if (type.equals("rmvb")) {
return 1;
}
return 9;
}
private static boolean checkfile(String path) {
File file = new File(path);
if (!file.isFile()) {
return false;
}
return true;
}
// 對(duì)ffmpeg無(wú)法解析的文件格式(wmv9,rm,rmvb等), 可以先用別的工具(mencoder)轉(zhuǎn)換為avi(ffmpeg能解析的)格式.
private static String processAVI(int type) {
ListString commend = new ArrayListString();
commend.add("c:\\ffmpeg\\mencoder");
commend.add(PATH);
commend.add("-oac");
commend.add("lavc");
commend.add("-lavcopts");
commend.add("acodec=mp3:abitrate=64");
commend.add("-ovc");
commend.add("xvid");
commend.add("-xvidencopts");
commend.add("bitrate=600");
commend.add("-of");
commend.add("avi");
commend.add("-o");
commend.add("c:\\ffmpeg\\output\\a.avi");
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
return "c:\\ffmpeg\\output\\a.avi";
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
private static boolean processFLV(String oldfilepath) {
if (!checkfile(PATH)) {
System.out.println(oldfilepath + " is not file");
return false;
}
// 文件命名
Calendar c = Calendar.getInstance();
String savename = String.valueOf(c.getTimeInMillis())+ Math.round(Math.random() * 100000);
ListString commend = new ArrayListString();
commend.add("c:\\ffmpeg\\ffmpeg");
commend.add("-i");
commend.add(oldfilepath);
commend.add("-ab");
commend.add("56");
commend.add("-ar");
commend.add("22050");
commend.add("-qscale");
commend.add("8");
commend.add("-r");
commend.add("15");
commend.add("-s");
commend.add("600x500");
commend.add("c:\\ffmpeg\\output\\a.flv");
try {
Runtime runtime = Runtime.getRuntime();
Process proce = null;
String cmd = "";
String cut = " c:\\ffmpeg\\ffmpeg.exe -i "
+ oldfilepath
+ " -y -f image2 -ss 8 -t 0.001 -s 600x500 c:\\ffmpeg\\output\\"
+ "a.jpg";
String cutCmd = cmd + cut;
proce = runtime.exec(cutCmd);
ProcessBuilder builder = new ProcessBuilder(commend);
builder.command(commend);
builder.start();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}