2011-01-10 18 views
5

私は、hibernate、jsf、およびmysqlを使用して.doc,.pdf.txt、イメージファイルを私のデータベースに保存しようとしています。java、doc、pdf、imageファイルをmysqlデータベースに保存するには?

タイプBLOBのファイルを保存する列を作成しました。 .txtタイプを保存すると、ファイルが正しく保存されます。

他の形式のファイルを保存しようとしている場合は、例外が発生します。 私の豆でフィールド名を作成しました:byte[] file;

どうすれば例外なく正しく保存できますか?私はmysqlの列のデータ型を変更する必要がありますか、Javaクラスの別のフィールドを使用する必要がありますか?


(BalusCに応答して)

これは、私は、ファイルの書き込みのために使用していたコードです。私はfileInputStreamを使い、hibernateフレームワークを使ってファイルを保存しています。

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管理Beanです:

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

ファイルmeta iデータベース内の場所などnfoが同期されますが、dbとファイルシステムが問題になります。

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)フォルダに保存できます。その参照を使用すると、ファイルにアクセスできます。

関連する問題