android studio上傳視訊儲存資料庫 後臺servlet mybatis
阿新 • • 發佈:2020-02-23
android studio / 佈局 在網上搬的磚 程式碼加修改。。。
在這裡插入程式碼片`
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="@color/colorPrimary" > <LinearLayout android:layout_width="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_height="60dp" android:layout_marginTop="80dp" android:orientation="horizontal"> <TextView android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="center_vertical" android:gravity="center" android:text="視訊名稱:" android:textColor="#FF8899" android:textSize="18dp"/> <EditText android:id="@+id/upload_video_name" android:layout_width="280dp" android:layout_height="50dp" android:layout_gravity="center_vertical" android:hint="請輸入上傳視訊名稱" android:layout_marginLeft="5dp" android:textSize="18dp" /> </LinearLayout> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="44dp" android:layout_marginLeft="100dp" android:layout_marginRight="100dp" android:layout_marginTop="80dp" android:text="選擇視訊" android:textSize="20sp"/> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="44dp" android:layout_marginLeft="100dp" android:layout_marginRight="100dp" android:layout_marginTop="40dp" android:text="點選上傳" android:textSize="20sp"/> <TextView android:id="@+id/post_text" android:layout_marginTop="40dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="0" /> <ProgressBar android:id="@+id/post_progress" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" /> </LinearLayout>
activate… 在activate 點選上傳的時候 傳送兩個請求 一個是上傳視訊,一個是上傳視訊的第一幀 經過壓縮 裡面還有 幾個方法沒有用上 複製上無妨
package wlt.com.sdk; import androidx.appcompat.app.AppCompatActivity; import android.accounts.NetworkErrorException; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.media.MediaMetadataRetriever; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.util.Log; import wlt.com.sdk.utils.My_Okhtt3; import wlt.com.sdk.utils.ProgressListener; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.MediaController; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.io.IOException; import java.net.URI; import java.nio.charset.Charset; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import wlt.com.sdk.utils.HttpUtil; import wlt.com.sdk.utils.kkk; public class MainActivity extends AppCompatActivity { private Button button,button1; private String path = "";//檔案路徑 private ProgressBar post_progress; private TextView post_text; EditText video_name; private String str; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportActionBar().setTitle("視訊上傳"); getSupportActionBar().setDisplayHomeAsUpEnabled(true); video_name = (EditText) findViewById(R.id.upload_video_name); init(); onclick2(); onclick(); } //初始化 public void init() { post_progress = (ProgressBar) findViewById(R.id.post_progress); post_text = (TextView) findViewById(R.id.post_text); button = (Button) this.findViewById(R.id.button);//開始上傳 button1 = (Button) this.findViewById(R.id.button1);//選擇視訊 } //setText Handler handler=new Handler(new Handler.Callback() { @Override public boolean handleMessage( Message msg) { if (msg.arg1==1){ video_name.setText(path); return true; } return false; } }); ## // 開始上傳 public void onclick() { button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (path.equals("")) { Toast.makeText(MainActivity.this,"請選擇視訊後,再點選上傳!",Toast.LENGTH_LONG).show(); } else { File file = new File(path); String postUrl = "http://192.168.1.106:8080/img/voideoServlet1"; //這個是上傳視訊 HttpUtil.postFile(postUrl,new ProgressListener() { @Override public void onProgress(long currentBytes,long contentLength,boolean done) { int progress = (int) (currentBytes * 100 / contentLength); post_progress.setProgress(progress); post_text.setText(progress + "%"); if (progress==100){ Toast.makeText(MainActivity.this,"上傳成功",Toast.LENGTH_LONG).show(); } } },new Callback() { @Override public void onFailure(Call call,IOException e) { } @Override public void onResponse(Call call,Response response) throws IOException { } },file); try { //這個是上傳圖片kkk.getNetVideoBitmap(path) 通過視訊路徑 返回bitmap kkk.YaSuoImage(bitmap) 壓縮bitmap 返回 file HttpUtil.postFileimg("http://192.168.1.106:8080/img/and_ImgServlet",new Callback() { @Override public void onFailure(Call call,IOException e) { } @Override public void onResponse(Call call,Response response) throws IOException { } },kkk.YaSuoImage(kkk.getNetVideoBitmap(path))); }catch (Exception e){ e.printStackTrace(); } } } }); } //開啟相簿 public void onclick2() { button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { seleteVedio(); } }); } public void seleteVedio() { Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i,66); } ## /** * 視訊回撥 */ @Override protected void onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); System.out.println("---onActivityResult-->>"); if (requestCode == 66 && resultCode == RESULT_OK && null != data) { Uri selectedVideo = data.getData(); String[] filePathColumn = {MediaStore.Video.Media.DATA}; Cursor cursor = getContentResolver().query(selectedVideo,filePathColumn,null,null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); path = cursor.getString(columnIndex); System.out.println("----------->>>>"+path); Message message=new Message(); message.arg1=1; message.obj=path; handler.sendMessage(message); cursor.close(); } if (resultCode != MainActivity.RESULT_OK) { return; } } }
上傳圖片的工具類
package wlt.com.sdk.utils; import android.graphics.Bitmap; import android.media.MediaMetadataRetriever; import android.os.Environment; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.logging.SimpleFormatter; /** * 獲取視訊第一幀 */ public class kkk { /** * 根據視訊地址獲取第一幀 * * @param videoUrl * @return */ public static Bitmap getNetVideoBitmap(String videoUrl) { Bitmap bitmap = null; MediaMetadataRetriever retriever = new MediaMetadataRetriever(); try { //根據url獲取縮圖 retriever.setDataSource(videoUrl,new HashMap()); //獲得第一幀圖片 bitmap = retriever.getFrameAtTime(); } catch (IllegalArgumentException e) { e.printStackTrace(); } finally { retriever.release(); } return bitmap; } /** * 壓縮圖片 * * @param bitmap * @return */ public static File YaSuoImage(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG,100,baos);//質量壓縮方法,這裡100表示不壓縮,把壓縮後的資料存放到baos中 int options = 100; while (baos.toByteArray().length / 1024 > 500) { //迴圈判斷如果壓縮後圖片是否大於500kb,大於繼續壓縮 baos.reset();//重置baos即清空baos options -= 10;//每次都減少10 bitmap.compress(Bitmap.CompressFormat.JPEG,options,baos);//這裡壓縮options%,把壓縮後的資料存放到baos中 long length = baos.toByteArray().length; } SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = new Date(System.currentTimeMillis()); String filename = format.format(date); File file = new File(Environment.getExternalStorageDirectory(),filename + ".png"); try { FileOutputStream fos = new FileOutputStream(file); try { fos.write(baos.toByteArray()); fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } recycleBitmap(bitmap); return file; } public static void recycleBitmap(Bitmap... bitmaps) { if (bitmaps == null) { return; } for (Bitmap bm : bitmaps) { if (null != bm && !bm.isRecycled()) { bm.recycle(); } } } }
okhttpUtils 工具類
package wlt.com.sdk.utils;
import android.accounts.NetworkErrorException;
import android.util.Log;
import java.io.File;
import java.util.concurrent.TimeUnit;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class HttpUtil {
private static OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10000,TimeUnit.MILLISECONDS)
.readTimeout(10000,TimeUnit.MILLISECONDS)
.writeTimeout(10000,TimeUnit.MILLISECONDS).build();
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
/**
* 上傳視訊
* @param url
* @param listener
* @param callback
* @param files
*/
public static void postFile(String url,final ProgressListener listener,okhttp3.Callback callback,File... files) {
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
Log.i("huang","files[0].getName()==" + files[0].getName());
//第一個引數要與Servlet中的一致
builder.addFormDataPart("myfile",files[0].getName(),RequestBody.create(MediaType.parse("application/octet-stream"),files[0]));
MultipartBody multipartBody = builder.build();
Request request = new Request.Builder().url(url).post(new ProgressRequestBody(multipartBody,listener)).build();
okHttpClient.newCall(request).enqueue(callback);
}
/**
* 上傳圖片
* @param url
* @param callback
* @param files
*/
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
public static void postFileimg(String url,File... files) {
RequestBody fileBody = RequestBody.create(MEDIA_TYPE_PNG,files[0]);
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("ss",fileBody)
// .addFormDataPart("userName",userName)
.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
okHttpClient.newCall(request).enqueue(callback);
}
/**
* 下載圖片
* @param url
* @param imagePath 圖片路徑
* @return byte[]
*/
public static byte[] downloadImage(String url,String imagePath) throws Exception {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url+"/show?fileName="+imagePath)
.build();
Response response = okHttpClient.newCall(request).execute();
byte[] bytes = response.body().bytes();
return bytes;
}
}
許可權 別忘加許可權
以上是是android端 完成 複製程式碼可用 下面是servlet
mybatils 使用的是介面方式 接口裡面的方法名是Mapper的id 返回型別也是一樣 傳的引數一樣。。。
jdbc.properties
driverClass=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
user=system
password=wltpas
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
<typeAliases>
<package name="wlt.com.vo.Student"/>
</typeAliases>
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="system"/>
<property name="password" value="wltpass"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="wlt/video/vo/VideoVo_Mapper.xml" />
<mapper resource="wlt/video/vo/VideoImg_Mapper.xml" />
</mappers>
</configuration>
VideoVo_Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="wlt.video.vo.VideoImg_Mapper_Imp">
<insert id="Insertssutdent" parameterType="wlt.video.vo.VideoImg">
insert into videoimg (v_imgurl )values( #{v_imgurl})
</insert>
<select id="SelectAll" resultType="wlt.video.vo.VideoImg">
select * from videoimg
</select>
</mapper>
VideoImg_Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="wlt.video.vo.VideoVo_Mapper_Imp">
<insert id="Insertssutdent" parameterType="wlt.video.vo.VideoVo">
insert into video (v_url )values( #{v_url})
</insert>
<select id="SelectAll" resultType="wlt.video.vo.VideoVo">
select * from video
</select>
</mapper>
VideoVo_Mapper_Imp
package wlt.video.vo;
import java.util.List;
public interface VideoVo_Mapper_Imp {
void Insertssutdent(VideoVo student);
List<VideoVo> SelectAll();
}
VideoImg_Mapper_Imp
package wlt.video.vo;
import java.util.List;
public interface VideoImg_Mapper_Imp {
void Insertssutdent(VideoImg student);
List<VideoImg> SelectAll();
}
接著就差vo
package wlt.video.vo;
import java.io.Serializable;
public class VideoVo implements Serializable{
private String v_url;
public String getV_url() {
return v_url;
}
public void setV_url(String vUrl) {
v_url = vUrl;
}
}
package wlt.video.vo;
import java.io.Serializable;
public class VideoImg implements Serializable{
private String v_imgurl;
public String getV_imgurl() {
return v_imgurl;
}
public void setV_imgurl(String vImgurl) {
v_imgurl = vImgurl;
}
}
MybatisUtil
package wlt.video.vo;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtil {
private static SqlSessionFactory ssf;
private static SqlSession ss;
public static SqlSession getSqlSession(){
try {
Reader in = Resources.getResourceAsReader("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(in);
ss = ssf.openSession();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return ss;
}
}
以上 mybatis 完成 servlet 下面
圖片的servlet
package wlt.img.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletContext;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.ibatis.session.SqlSession;
import wlt.video.vo.VideoImg;
import wlt.video.vo.VideoImg_Mapper_Imp;
import wlt.video.vo.VideoVo_Mapper_Imp;
@SuppressWarnings("serial")
public class and_ImgServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
String url="";
SqlSession session=wlt.video.vo.MybatisUtil.getSqlSession();
VideoImg_Mapper_Imp imp= session.getMapper(VideoImg_Mapper_Imp.class);
// 為解析類提供配置資訊
DiskFileItemFactory factory = new DiskFileItemFactory();
// 建立解析類的例項
ServletFileUpload sfu = new ServletFileUpload(factory);
// 開始解析
sfu.setFileSizeMax(1024 * 1024 * 5);
// 每個表單域中資料會封裝到一個對應的FileItem物件上
try {
List<FileItem> items = sfu.parseRequest(req);
// 區分表單域
for (int i = 0; i < items.size(); i++) {
FileItem item = items.get(i);
// isFormField為true,表示這不是檔案上傳表單域
if (!item.isFormField()) {
ServletContext sctx = getServletContext();
// 獲得存放檔案的物理路徑
// upload下的某個資料夾 得到當前線上的使用者 找到對應的資料夾
String path = sctx.getRealPath("/upload/images");
System.out.println(path);
// 獲得檔名
String fileName = item.getName();
url="http://192.168.1.106:8080/video/images/"+fileName;
VideoImg v=new VideoImg();
v.setV_imgurl(url);
imp.Insertssutdent(v);
session.commit();
System.out.println("新增成功");
//E:\cat\apache-tomcat-6.0.29\webapps\img\images
System.out.println(fileName);
// 該方法在某些平臺(作業系統),會返回路徑+檔名
fileName = fileName
.substring(fileName.lastIndexOf("/") + 1);
File file = new File(path + "\\" + fileName);
System.out.println("--->>" + file);
if (!file.exists()) {
item.write(file);
// 將上傳圖片的名字記錄到資料庫中
System.out.println("----------ok-----...");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
視訊的servlt
package wlt.img.servlet;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletContext;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.ibatis.session.SqlSession;
import wlt.video.vo.VideoVo;
import wlt.video.vo.VideoVo_Mapper_Imp;
public class voideoServlet1 extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
this.doPost(request,response);
}
public void doPost(HttpServletRequest request,IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String url="";
SqlSession session=wlt.video.vo.MybatisUtil.getSqlSession();
VideoVo_Mapper_Imp imp= session.getMapper(VideoVo_Mapper_Imp.class);
PrintWriter out = response.getWriter();
DiskFileItemFactory factory=new DiskFileItemFactory();
String upload=this.getServletContext().getRealPath("/upload");
System.out.println("--->>:"+upload);
factory.setSizeThreshold(1024*1024*5);
ServletFileUpload fileUpload=new ServletFileUpload(factory);
try {
List<FileItem> list=fileUpload.parseRequest(request);
System.out.println("==="+list.size());
for (int i = 0; i < list.size(); i++) {
FileItem item = list.get(i);
ServletContext sctx = getServletContext();
String fileName = item.getName();
System.out.println(fileName);
url="http://192.168.1.106:8080/video/"+fileName;
System.out.println("--url->>"+url);
VideoVo videoVo=new VideoVo();
videoVo.setV_url(url);
imp.Insertssutdent(videoVo);
session.commit();
System.out.println("新增session成功");
System.out.println("--url->>");
// 該方法在某些平臺(作業系統),會返回路徑+檔名
fileName = fileName
.substring(fileName.lastIndexOf("/") + 1);
File file = new File(upload + "\\" + fileName);
System.out.println("--->>" + file.toString());
if (!file.exists()) {
try {
item.write(file);
System.out.println("----------ss-----...");
//out.print("http://192.168.1.106:8080/img/video/a.mp4");這個是給Androidstudio 返回的
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
out.write("no");
}
out.flush();
out.close();
}
}
# web.xml
<servlet>
<servlet-name>and_ImgServlet</servlet-name>
<servlet-class>wlt.img.servlet.and_ImgServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>and_ImgServlet</servlet-name>
<url-pattern>/and_ImgServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>voideoServlet1</servlet-name>
<servlet-class>wlt.img.servlet.voideoServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>voideoServlet1</servlet-name>
<url-pattern>/voideoServlet1</url-pattern>
</servlet-mapping>
## 最後就是tomcat 開啟 server.xml
新增 可以理解取個別名
<Context docBase="E:\cat\apache-tomcat-6.0.29\webapps\img\upload" path="/video" reloadable="true"/>
url="http://192.168.1.106:8080/video/"+fileName;
這個video==E:\cat\apache-tomcat-6.0.29\webapps\img\upload 這個路徑
![在這裡插入圖片描述](https://www.icode9.com/img/ll/?i=202002231338380.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MjE4MzA3,size_16,color_FFFFFF,t_70)
## 想一想 ok 能用到 你懂得