PDA

View Full Version : خواندن فایلهای video از دیتا بیس



zer0cool
پنج شنبه 27 دی 1386, 09:05 صبح
من میخوام با استفاده از JSP بدون بکار بردن component ها از دیتا بیس فایلهای video رو بخونم آیا باید از servlet استفاده کنم؟

javaphantom
سه شنبه 02 بهمن 1386, 17:50 عصر
jsp همان servlet هست برای اینکه این کار رو انجام بدی آدرس فایل video رو که توی database ذخیره کردی بخون و content type صفحه رو که آدرس بصورت لینک درست می کنی از نوع video/3gpp قرار بده هر کس که روی لینک click کنه برنامه ای که در درون سیستم خودش می تونه فایلهای video رو پشتیبانی کنه فعال می شه.

zer0cool
چهارشنبه 03 بهمن 1386, 12:00 عصر
مسئله اینجاست که باید از یه applet استفاده بشه در داخل صفحه html و تمام کدها رو خودم باید بنویسم یعنی فایل ویدئو رو باید تو دیتا بیس ذخیره کنم و سپس به صورت یه stream اونو از دیتا بیس بخونم البته این وسط یه thread هم قرار میگیره که دانلود فایل رو کنترل میکنه ولی من تو کنترل این thead مشکل دارم البته دارم روش کار میکنم.از راهنماییتون متشکرم.

zer0cool
سه شنبه 16 بهمن 1386, 13:38 عصر
خواهشمندم اگر کسی اطلاعاتی درباره بازیابی ویدئو از دیتابیس داره در اختیارم بگذاره من تو یه eBook دیده بودم که گفته بود مثل بازیابی عکس از دیتابیس میمونه ولی کدم که در زیر گذاشتم جواب نمیده:


package project;

import javax.swing.*;
import java.awt.*;
import java.sql.*;
import java.io.*;
import java.awt.event.*;

public class pic extends JFrame {

Image img;

public pic(){

try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c1=DriverManager.getConnection("jdbc:odbc:driver={sql server};server=.;database=anim","sa","");
Statement st1 = c1.createStatement();
ResultSet rs1=null;
rs1=st1.executeQuery("select pic from anim where nam='ava'");

while (rs1.next()){
byte[] buffer=rs1.getBytes(1);
img=Toolkit.getDefaultToolkit().createImage(buffer );
repaint();
}
st1.close();
rs1.close();
c1.close();
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
public void paint(Graphics g){
super.paint(g);
g.drawImage(img,150,300,this);
repaint();
}

public static void main(String[] args){
pic frm = new pic();
frm.setSize(450,550);
frm.setVisible(true);

}
}

javaphantom
یک شنبه 21 بهمن 1386, 00:17 صبح
از آنجایی که چند بار در این تالار کسانی رو دیدم که سعی بر این داشتن یک محتویات یک فایل رو در درون یک field بانگ اطلاعاتی ذخیره و دوباره بازیابی کنند و هر کدام با مشکلی مواجه بودن سعی می کنم که یک توضیح مختصر در باره روند کار و استفاده از api های مناسب بدهم. از آنجایی که بعضی از دوستان به من لطف داشتن و از طریق email و پیام خصوصی خواستار مشاوره در زمینه این موضوع را با من داشتن ولی پیشاپیش از آنها عذرخواهی می کنم که نمی توانم کد را بصورت کامل در اختبارشون بزارم و فکر کنم با دادن توضیحات داده شده و مختصر اشاره ای به مسله خودشان به راحتی راه حل را پیدا کنند.
۱ تحلیل سیستم
از آنجایی که همگی دوستان می دادند جاوا یک زبان مستقل و آزاد از هر platform یا همان سکو می باشد. پس چه خوب است موقع استفاده از این تکنولوژی در بخش تحلیل از تکنولوژی های دیگری استفاده کنیم که این آزادی و استقلال این زبان محفوظ بماند. مثلا در انتخاب OS(سیستم عامل) database (بانک اطلاعاتی) و باقی نرم افزارها و سخت افزارها بسیار دقت شود. یکی از ایرادهایی که من در طراحی و تحلیل اکثر دوستان می بینم این است که از OS و Database هایی استفاده می کنند که اون حالت استقلال و آزادی جاوا رو ازشون می گیره. تبدیل یک executable jar file به یک exe فایل یا استفاده از بانک اطلاعاتی access و همچنین استفاده از OS ویندوز همگی هاکی از این می باشد که ما در قدم اول برای تعریف یک project اشتباه بر داشتیم. هر چند که قدرت این زبان بقدری هست که تمام این اشتباهات رو پوشش می دهد ولی واقعا دست و پای این بابا رو بستین امکان دارد در پروژهای کوچک و تمرینی این کاستی و این محدودیت ایجاد شده به چشم نیاید ولی در عمل و دنیای واقعی و دید دنیای برنامه نویسی جاوا اشتباه فکر شده است و در پروژهای بزرگ ضعف خودشو نشون خواهد داد. پس من برای اینکه بتونم تا حدی خودم به گفتهای خودم عمل کنم و این محدودیت ها رو از سیستم حذف کنم
سیستم عامل رو linux
بانک اطلاعاتی رو mysql در نظر گرفتم
معماری کار.
از آنجایی که برای پیاده سازی این برنامه از یک database مجازا استفاده می کنیم این شرایط برای ما پیش می آید که کل برنامه در دو لایه متفاوت پیاده سازی بشه و کلا از معماری دولایه برای پیاده سازی کل برنامه استفاده می کنیم.
شایان ذکر که بگم چون ما می خواهیم اطلاعات یک فایل رو که امکان این را دارد این فایل حجیم باشد در داخل database ریخته یا بازخوانی کنیم باید در قسمت لایه database کاملا عمل نرمال سازی صورت گرفته شده باشد چون بار ترافیکی سنگینی بر دوش بانک اطلاعاتی ما می باشد و می توان گفت که دقسمت model ما بصورت fat کار کرده ایم و در قسمت application بصورت thin.
در لایه بانک اطلاتی
با فرض اینکه یک table با دو فیلد در ساخته شده یکی نام فایل و دومی محتویات فایل
که اولی از نوع varchar(200) و دوی از نوع longblob گرفته شده است.
blob , clob
همانطور که می دانیم در I/O در جاوا ما به دو صورت کاراکتری و باینری می توانیم جریانی ایجاد کنیم. اسفتاده از binary large object یا همان blob و clob یا همان character large object می توانند راه حلهای مناسب برای کار ما باشند.
در mysql شما می توانید engine های متفاوتی را از بانک اطلاعاتی در خواست کنید مانند oracle که در نوع خواند و نوشتن کلا سرویس دهی به شما بسیار کمک می کنند.
datatype که من انتخاب کردم longblob می باشد که اندازه 2 به توان ۳۲ منهای یک بایت رو پشتیبانی می کند که حدود 4 گیگا بایت می شود. در JDBC2 دو نوع interface با نامهای Blob , Clob وجود دارند که از طریق ا ین دو واسطه می توانید عملیات های مربوط به datatype های blob , clob رو هندل کنید. Blob b = rs.getBlob(1)
قطعه کد زیر برای هنگام خواندن اطلاعات از یک فایل و ذخیره آن در فیلد مذکور است
فقط برای دادن ایده می باشد.
import java.sql.*
import java.io.*;
برای ریختن اطلاعات
Connection con=null;
FileInputStream f = new FileInputStream("/root/movie/xx.mpg");
byte[] temp = new byte[1024];
byte[] data = null;
int sz,len=0;
while (sz=f.read(temp)) != -1) {
if (data == null) {
len = sz;
data = temp;
}else {
byte[] narr;
int klen;
klen = len +sz;
narr = new byte[klen];
System.arrcopy(data,0,narr,0,len);
System.arrycopy(temp,0,narr,len,sz);
data = narr;
len = klen;
}
}
if(len != data.length) {
byte [] narr = new byte[len];
System.arraycopy )data,0,narr,0,len);
data = narr}
statement stm = con.preparedStatement("insert into test(name,value) values(?,?)");
stm.setString(1,"xx");
stm.setObject(2,data);
stm.execute();
f.delete();
con.close();
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
اما برای خواند اطلاعات از database
stmt = con.prepareStatement("SELECT blobData FROM BlobTest WHERE fileName = ?");
stmt.setString(1, "xx");
rs = stmt.executeQuery( );
Blob b = rs.getBlob(1);
BufferedOutputStream os;
os = new BufferedOutputStream(new FileOutputStream("xx.mpg"));
os.write(b.getBytes(0, (int)b.length( )), 0,
(int)b.length( ));
os.flush( );
os.close( );
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnn


امیدوارم تونسته باشم یک ایده ای به شما خواندگان داده باشم. هر گونه اشتباه منو ببخشید و خودتون تصحیح کنید.
چاکس

jeus
سه شنبه 31 اردیبهشت 1387, 23:21 عصر
سلام دوستان من از javaphantom (http://barnamenevis.org/forum/member.php?u=17370) تشکر میکنم


import java.sql.*
import java.io.*;
Connection con=null;
FileInputStream f = new FileInputStream("/root/movie/xx.mpg");
byte[] temp = new byte[1024];
byte[] data = null;
int sz,len=0;
while (sz=f.read(temp)) != -1) {
if (data == null) {
len = sz;
data = temp;
}else {
byte[] narr;
int klen;
klen = len +sz;
narr = new byte[klen];
System.arrcopy(data,0,narr,0,len);
System.arrycopy(temp,0,narr,len,sz);
data = narr;
len = klen;
}
}
if(len != data.length) {
byte [] narr = new byte[len];
System.arraycopy )data,0,narr,0,len);
data = narr}
statement stm = con.preparedStatement("insert into test(name,value) values(?,?)");
stm.setString(1,"xx");
stm.setObject(2,data);
stm.execute();
f.delete();
con.close();




stmt = con.prepareStatement("SELECT blobData FROM BlobTest WHERE fileName = ?");
stmt.setString(1, "xx");
rs = stmt.executeQuery( );
Blob b = rs.getBlob(1);
BufferedOutputStream os;
os = new BufferedOutputStream(new FileOutputStream("xx.mpg"));
os.write(b.getBytes(0, (int)b.length( )), 0,
(int)b.length( ));
os.flush( );
os.close( );

jeus
سه شنبه 31 اردیبهشت 1387, 23:32 عصر
یک روش دیگه برای وارد کردن درون دیتا بیس

import java.sql.*;
import java.io.*;

public class insertImage{
public static void main(String[] args) {
System.out.println("Insert Image Example!");
String driverName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/";
String dbName = "hibernatetutorial";
String userName = "root";
String password = "root";
Connection con = null;
try{
Class.forName(driverName);
con = DriverManager.getConnection(url+dbName,userName,pa ssword);
Statement st = con.createStatement();
File imgfile = new File("images.jpg");
FileInputStream fin = new FileInputStream(imgfile);
PreparedStatement pre = con.prepareStatement("insert into Image values(?,?,?)");
pre.setInt(1,5);
pre.setString(2,"Durga");
pre.setBinaryStream(3,fin,(int)imgfile.length());
pre.executeUpdate();
System.out.println("Inserting Successfully!");
pre.close();
con.close();
}
catch (Exception e){
System.out.println(e.getMessage());
}
}
}

منبع :http://www.roseindia.net

zer0cool
شنبه 04 خرداد 1387, 13:13 عصر
مشکل ذخیره کردنش نیست مشکلم سر خوندنشه و اینکه این باید تو یه برنامه تحت وب بکار بره و اینکه بار روی شبکه رو میخوام با کمک یک یا دوتا theared کنترل کنم ولی مشکل اصلی خوندنش بوده و هست.

ممنون برای راهنماییتون.

mazdadoost
شنبه 04 خرداد 1387, 14:48 عصر
دوست عزیز :
با توجه از پستی که در ابتدا داشتن بنده امید وارم منظور جنابعالی رو درست درک کرده باشم.چنانچه شما این سناریو رو مد نظر داشته باشید :
1-داده هایی از نوع باینری(باینری به معنای عام کلمه) مثلا محتویات یک فایل ویدئو موجود هست.
2-این داده ها باید در فیلد های Blob از یه دیتابیس RDBMS مثل MySql به ازای هر سطر یک فایل ذخیره بشن.
3-در یک برنامه مبتنی بر وب شما می خواید نحوی کل محتوای هر ویدئو در سطر مورد نظر رو به شکل progressive در وب پیج مورد نظرتون به اصطلاح embeded کنید.(مثل مورد YouTube)

به شکل خلاصه باید عرض کنم :
1در سمت دیتا بیس شما تنها کاری که لازمه انجام بدین قرار دادن فایل ها در ستون های دیتا بیس.منتها باید دقت کنید که در مثال ما که فایل های ویدئوئی هست از چه Encoder ی برای کد کردن داده ها استفاده شده.
(فعلا از مباحث مربوط به اینکه چه Encoder ی و چرا میگذریم.).فرض میکنیم این داده ها به فرمت rm(Real Media) هستن.حالا چه توسط شما و چه کاربر نهایی در دیتا بیس قرار داده میشه.
2-برای پخش این فایل ها به ضورت مستقیم در صفحات وب راح حل های متنوعی هست.اما همگی بر این اصل کلی استواره : embeded کردن Client پلیری که دارای Decoder فرمتی هست که شما از Encoderش برای کارتون استفاده کردین.
a)میتونید از Client های آماده استفاده کنید:مثلا نرم افزار RealPlayer رو در پیجتون embeded کنبد و در کد embeded کردنش به Real بگید که فایل مورد نظر رو به صورت progressive از یه پروکسی که نوشتین بخونه!این پروکسی چیه!خیلی ساده:یه پیج jsp یا Servlet یا WebService که بر اساس درخواست Client ها که در مثال ما نرم افزار Real هست فایل مورد نظر رو از سطر مربوطه میگیره در یه Stream میذاره و به Client تحویل میده!در عمل میتونید این پروکسی رو با Soket های I/O و مخصوصا به شکل حرفه ایNew I/O (به دلایل زیادی :مثل سرعت بیشتر-NonBlocking بودن-و استفاده خیلی کمتر از منابع)و ترد ها(مخصوصا Concurent Ultility ها)پیاده بشه.مثلا میتونید کاری کنید که به ازای هر 20 در خواست تعداد کمتری thread و Soket استفاده شه.
با این روش شما خیلی کارتون راحت میشه.به نحوی که کافیه فقط کد دیتا بیس و پروکسی رو پیاده کنید.از طرف دیگه میتونید مثلا در پیج هاتون از سایر Client Player ها مثل Flash Player-MediaPlayer و Qtime استفاده کنید .
b)چنانچه مایل باشید می تونید خودتون Applet ی بنویسید که به عنوان Player کار کنه.برای این کار شما باید با Java Media Framework i یا به اختصارJMF و پروتکل مورد استفادش آشنا بشید. در این API هر چیز برای کار با صوت وتصویر روی شبکه از پخش فیلم تا Live Brodcastig وجود داره.و برای کار شما آشنایی آبتدایی با چند کلاس کلیدیش کافیه!این Framework فرمت های متنوعی رو پشتیبانی میکنه و البته مثل Image I/O میشه پشتیانی از فرمت های جدید رو درش Plug کرد.
اصول کار این بود.پس دستارو بالا بزنید و شروع به کار کنید!احتمالا راح حل دوم رو میپسندید!حجم JMF خیلی کمه حدود 4.5!
موفق باشید.