2011-01-10 11 views
5

मैं .doc, .pdf, .txt, और हाइबरनेट, जेएसएफ और माइस्क्ल का उपयोग करके अपने डेटाबेस में छवि फ़ाइलों को सहेजने की कोशिश कर रहा हूं।जावा का उपयोग कर mysql डेटाबेस में दस्तावेज़, पीडीएफ, और छवि फ़ाइलों को कैसे सहेजना है?

मैंने बीएलओबी प्रकार की फ़ाइल को सहेजने के लिए एक कॉलम बनाया है। अगर मैं .txt प्रकार सहेज रहा हूं तो फ़ाइलें सही ढंग से सहेजी जाती हैं।

यदि मैं किसी अन्य प्रारूप की फ़ाइल को सहेजने की कोशिश कर रहा हूं तो मुझे अपवाद मिल रहा है। मेरे बीन में मैंने एक फ़ील्ड नाम बनाया है: byte[] file;

मैं बिना किसी अपवाद के इसे सही तरीके से कैसे सहेज सकता हूं? क्या मुझे mysql कॉलम के लिए डेटाटाइप बदलने या जावा क्लास के लिए एक अलग फ़ील्ड का उपयोग करने की आवश्यकता है?


(BalusC के जवाब में)

इस कोड को जो मैं फ़ाइल लिखने के लिए उपयोग कर रहा हूँ है। मैं fileInputStream का उपयोग कर रहा हूं और फिर हाइबरनेट फ्रेमवर्क का उपयोग कर फ़ाइल को सहेज रहा हूं।

Iterator iter = items.iterator(); 
while (iter.hasNext()) { 
FileItem item = (FileItem) iter.next(); 

if (item.isFormField()) { 
    String name = item.getFieldName(); 
    String value = item.getString(); 
} else { 
    String fieldName = item.getFieldName(); 
    String fileName = item.getName(); 
    String contentType = item.getContentType(); 
    boolean isInMemory = item.isInMemory(); 
    long sizeInBytes = item.getSize(); 
    byte[] fileInBytes=item.get(); 


    try { 
     File uploadedFile = new File("/home/db/webApp", fileName); 
     uploadedFile.createNewFile(); 
     FileInputStream fileInputStream = new FileInputStream(uploadedFile); 
     //convert file into array of bytes 
     fileInputStream.read(fileInBytes); 
     fileInputStream.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    UploadedFile object= new UploadedFile(); 
    object.setFile(fileInBytes); 
    uploadedObject.setFileName(fileName); 
    session.save(object); 

UploadedFile JSF कामयाब सेम है:

public class UploadedFile{ 
    private String fileName; 
    private byte[] file; 
    /** 
    * @return the fileName 
    */ 
    public String getFileName() { 
     return fileName; 
    } 
    /** 
    * @param fileName the fileName to set 
    */ 
    public void setFileName(String fileName) { 
     this.fileName = fileName; 
    } 
    /** 
    * @return the file 
    */ 
    public byte[] getFile() { 
    return file; 
    } 
    /** 
    * @param file the file to set 
    */ 
    public void setFile(byte[] file) { 
     this.file = file; 
    } 
} 

और मेरे डेटाबेस तालिका निम्नलिखित है संरचना:

Create UploadFile(FILE_NAME` VARCHAR(1000) NOT NULL, 
`FILE` BLOB NOT NULL); 
+0

आपको क्या अपवाद मिलता है? – soulcheck

उत्तर

3

इसके बेहतर एक स्थान में फ़ाइल को सहेजने और में स्थान को बचाने के लिए डेटाबेस

+0

शायद कुछ बहुत ही मामूली मामलों में, लेकिन आमतौर पर डेटाबेस में बजाए फ़ाइल सिस्टम पर बाइनरी डेटा स्टोर करने का सुझाव देना बहुत अच्छा विचार नहीं है। – jarnbjo

+0

@jarnbjo यह निर्भर करता है। कल्पना करें कि आपके पास सोशल नेटवर्क है और लाखों छवियों को स्टोर करने की आवश्यकता है। क्या आप इस डेटा को डेटाबेस में स्टोर करेंगे? –

+0

@ जेम्स: क्यों नहीं? – jarnbjo

0

फ़ाइल मेटा स्टोर करें I एनएफओ जैसे डीबी में स्थान, लेकिन सिंक्रनाइज़ डीबी और फाइल सिस्टम एक मुद्दा होगा।

2

आपकी समस्या ऐसा लगता है कि यह एक डेटा प्रकार समस्या है। MySQL में एक BLOB बहुत बड़ा नहीं है। अपनी तालिका के कॉलम डेटा प्रकार को इसके बजाय LONGBLOB पर सेट करने का प्रयास करें।

+0

इसे एक चेतावनी के साथ सही आकार में छोटा कर दिया जाना चाहिए। – soulcheck

0
package com.server; 


import java.io.*; 

import java.sql.*; 
import java.util.*; 
import java.text.*; 
import java.util.regex.*; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.*; 
import org.mortbay.jetty.Response; 

import javax.servlet.*; 
import javax.servlet.http.*; 

import java.io.*; 
import java.sql.*; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.ServletInputStream.*; 
import java.io.PrintWriter; 

public class XmlServlet extends HttpServlet { 

public void doPost(HttpServletRequest req,HttpServletResponse res) 
{ 
    File uploadedFile; 


    System.out.print("on server"); 
try{ 

Class.forName("com.mysql.jdbc.Driver"); 
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3308/image","root","root1"); 

PrintWriter out=res.getWriter(); 

//out.println("<br>Content type is :: " +contentType); 
//to get the content type information from JSP Request Header 
String contentType = req.getContentType(); 
int flag=0; 
FileInputStream fis=null; 
FileOutputStream fileOut=null; 
//here we are checking the content type is not equal to Null and as well as the passed data from mulitpart/form-data is greater than or equal to 0 
if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) 
{ 
DataInputStream in = new DataInputStream(req.getInputStream()); 
//we are taking the length of Content type data 
int formDataLength = req.getContentLength(); 
byte dataBytes[] = new byte[formDataLength]; 
int byteRead = 0; 
int totalBytesRead = 0; 

//this loop converting the uploaded file into byte code 
while (totalBytesRead < formDataLength) { 
byteRead = in.read(dataBytes, totalBytesRead,formDataLength); 
totalBytesRead += byteRead; 
} 

String file = new String(dataBytes); 
//for saving the file name 
String saveFile = file.substring(file.indexOf("filename=\"") + 10); 
saveFile = saveFile.substring(0, saveFile.indexOf("\n")); 
out.println("savefiledddd"+saveFile); 
int extension_save=saveFile.lastIndexOf("\""); 
String extension_saveName=saveFile.substring(extension_save); 

//Here we are invoking the absolute path out of the encrypted data 

saveFile = saveFile.substring(saveFile.lastIndexOf("\\")+ 1,saveFile.indexOf("\"")); 
int lastIndex = contentType.lastIndexOf("="); 
String boundary = contentType.substring(lastIndex + 1,contentType.length()); 
int pos; 

//extracting the index of file 
pos = file.indexOf("filename=\""); 
pos = file.indexOf("\n", pos) + 1; 
pos = file.indexOf("\n", pos) + 1; 
pos = file.indexOf("\n", pos) + 1; 
int boundaryLocation = file.indexOf(boundary, pos) - 4; 
int startPos = ((file.substring(0, pos)).getBytes()).length; 
int endPos = ((file.substring(0, boundaryLocation)).getBytes()).length; 

out.println("savefile"+saveFile); 

int file_No=22; 

uploadedFile=new File("./war/img"); 

    uploadedFile.mkdir(); 


    String kk=uploadedFile.getAbsolutePath(); 


    String pathname_dir=kk+"/"+saveFile; 
    //String pathname_dir="C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0\\jk\\"+saveFile; 
    File filepath=new File(pathname_dir); 
    out.println("filepath_ "+filepath); 
    fileOut = new FileOutputStream(filepath); 
    fileOut.write(dataBytes, startPos, (endPos - startPos)); 
    fileOut.flush(); 
    out.println("<h1> your files are saved</h1></body></html>"); 
    out.close(); 

     File database_filename=new File(pathname_dir); 
      fis=new FileInputStream(database_filename); 

int len=(int)database_filename.length(); 
      PreparedStatement ps = conn.prepareStatement("insert into new (image) values (?)"); 
      ps.setBinaryStream(1,fis,len); 
      ps.executeUpdate(); 
      ps.close(); 
      flag=1; 

} 

if(flag==1) 
{ 
fileOut.close(); 
fis.close(); 
} 
}catch(Exception e) 
{ 
System.out.println("Exception Due to"+e); 
e.printStackTrace(); 
} 
} 
} 

यह एक सर्वर कोड है। उस कोड से आप डेटाबेस में संग्रहीत किसी भी फ़ाइल को अपलोड कर सकते हैं और फ़ाइल को सर्वर पर (img) फ़ोल्डर में संग्रहीत कर सकते हैं। इसके संदर्भ का उपयोग करके आप फ़ाइल तक पहुंच सकते हैं।

संबंधित मुद्दे