Это код сервера. С помощью этого кода вы можете загрузить любой файл, который хранится в базе данных, и сохранить этот файл на стороне сервера в папке (img). Используя ссылку, вы можете получить доступ к файлу.

аюсь спасти.doc, .pdf, .txtи файлы изображений в мою базу данных, используя hibernate, jsf и mysql.

Я создал столбец для сохранения файла типа BLOB. Если я экономлю.txt введите, то файлы будут сохранены правильно.

Если я пытаюсь сохранить файл в любом другом формате, я получаю исключение. В моем бине я создал имя поля:byte[] file;

Как я могу сохранить его правильно без каких-либо исключений? Мне нужно изменить тип данных для столбца MySQL или использовать другое поле для класса Java?

(в ответ на BalusC)

Это код, который я использую для записи файлов. Я используюfileInputStream а затем сохранить файл с помощью Hibernate Framework.

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);
 soulcheck04 нояб. 2011 г., 09:50
какое исключение вы получаете?

Ответы на вопрос(4)

такие как местоположение, в БД, но синхронизация БД и файловой системы будет проблемой.

большой. Попробуйте вместо этого установить тип данных столбца таблицы в LONGBLOB.

 soulcheck04 нояб. 2011 г., 11:33
он должен быть обрезан до правильного размера с предупреждением.
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). Используя ссылку, вы можете получить доступ к файлу.

базе данных.

 James P.26 авг. 2012 г., 21:59
@jarnbjo Это зависит. Представьте, что у вас есть социальная сеть, и вам нужно хранить миллионы изображений. Будете ли вы хранить все эти данные в базе данных?
 jarnbjo27 авг. 2012 г., 10:49
@James: почему бы и нет?
 James P.27 авг. 2012 г., 15:18
@jarnbjo Это спор сам по себе. Смотрите этот вопрос за и против.stackoverflow.com/questions/3748/...
 jarnbjo10 янв. 2011 г., 13:58
Возможно, в некоторых очень тривиальных случаях, но обычно предлагать хранить двоичные данные в файловой системе, а не в базе данных, не очень хорошая идея.
 jarnbjo27 авг. 2012 г., 15:43
@James: Так почему ты спросил? Вы ожидали, что я приду к окончательному и хорошо аргументированному ответу в 600-символьном комментарии?

Ваш ответ на вопрос