الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حفظ صورة في mysql عن طريق كود جافا

بدأه golden_rose في 2 أغسطس 2011 · 8 رد · 1,839 مشاهدة · في JavaEE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اواجه مشكلة في تخزين صورة في قاعدة البيانات mysql

لدي قاعدة بيانات على الشكل الاتي

create table test
(id int(11) not null,
name char(11),
age char(11),
image blob,
primary key (id));

وقمت بانشاء صفحة jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Hello World!</h1>
         <form action="/newupload/yes" method="post" >
                        Name: <input type="text" name="Name" id ="Name"/><br/>
                        Age: <input type="text" name="Age" id="Age"/><br/>
                        Choose the file to upload: <input type="file" name="fileToUpload" id="fileToUpload"/><br/>
                        <input type="submit"/>
                </form>
    </body>
</html>

وصفحة سرفليت

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

/**
*
* @author
*/
public class yes extends HttpServlet {

/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
ResultSet rs = null;
PreparedStatement psmnt = null;
FileInputStream fis;
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet yes</title>");
out.println("</head>");
out.println("<body>");
Class.forName("com.mysql.jdbc.Driver");
Connection c= DriverManager.getConnection("jdbc:mysql://localhost/arabic","root","");
File image = new File(request.getParameter("fileToUpload"));
psmnt = c.prepareStatement("insert into test(name, age, image) values(?,?,?)");
psmnt.setString(1,request.getParameter("Name"));
psmnt.setString(2,request.getParameter("Age"));
//psmnt.setString(3,request.getParameter("fileToUpload"));
fis = new FileInputStream(image);
psmnt.setBinaryStream(3, (InputStream)fis, (int)(image.length()));
int s = psmnt.executeUpdate("insert into test(name, age, image) values(?,?,?)");
if(s>0) {
out.println("Uploaded successfully !");
}
else {
out.println("unsucessfull to upload image.");
}

//Statement f = c.createStatement();
//int res = f.executeUpdate(query);


c.close();
psmnt.close();

out.println("</body>");
out.println("</html>");
}
catch (Exception ex) {
out.println("Found some error : "+ex);
}

finally {
out.close();
}
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>

}

ولكن عند التطبيق يكون الناتج

Found some error : java.io.FileNotFoundException: HpP46424.jpg (‏‏يتعذر على النظام العثور على الملف المحدد)

هل من مساعدة ؟؟؟؟؟؟؟؟؟؟؟؟

تم تعديل هذه المشاركة بواسطة golden_rose في 2 أغسطس 2011 في 15:02

#2

بصراحه انا واجهت هذه المشكله كثيرا ولكن لم اجد حل

لكن اعتقد هناك حل باستخدام الجافا اسكريبت لكن ليس لى خبره بها

من الافضل ان تقوم بخزين الصوره فى ملفات الخادم وتخزن فقط مسار الصوره

وفى كل مره تستدعيها من مكان التخزين بالمسار

لان هناك مشكله كمان ان لو خزنت الصور ف قاعده البيانات هتكون كبيره

تانى حاجه انها فى عمليه الـ Backup بتعمل مشاكل

Software Developer
Mahmoudkelany.com


 

#3

السلام عليكم

هل جربت أن تضغ BreakPoint عند هذا السطر

fis = new FileInputStream(image);

وتحقق من قيمة image. الأرجج أن البرنامج يحاول قراءة الملف من مكان غير الذي تتوقعه ولذلك يحصل هذا الException. الأفضل دائماً أن تضع كامل الStacktrace الذي يحصل.

#4
Mahmoud Kelany كتب:

من الافضل ان تقوم بخزين الصوره فى ملفات الخادم وتخزن فقط مسار الصوره

وفى كل مره تستدعيها من مكان التخزين بالمسار

شكرا اخي

ولكن هل بامكانك توضيح هذه الطريقة لانني لم افهم ما المقصود منها او كيف ساقوم بعمل ذلك

وان كان يوجد مثال عن هذه الطريقة ساكون لك من الشاكرين

#5
golden_rose كتب:

شكرا اخي

ولكن هل بامكانك توضيح هذه الطريقة لانني لم افهم ما المقصود منها او كيف ساقوم بعمل ذلك

وان كان يوجد مثال عن هذه الطريقة ساكون لك من الشاكرين

/index.php?showtopic=212879

/index.php?showtopic=239711

وابحث فى المنتدى ستجد الكثير

Software Developer
Mahmoudkelany.com


 

#6

طبعا أخى من الطبيعى أن يعطى لك خطأ FileNotFoundException ....

لتخزين ملف في قاعدة بيانات من تطبيق ويب يجب عليك عمل الأتى:

1- رفع محتويات الملف إلى الخادم

2- إستخدام محتويات الملف لتخزينها داخل قاعدة بيانات (أو داخل الخادم نفسه - ال File System الخاص به)

لكن ما تحاول أنت فعله هو الأتى:

1- الوصول من على الخادم لملف بنفس المسار الذي قام المستخدم بتحديده على العميل (و بالتالى FileNotFoundException ..)

أرجو أن تكون فهمت المغذي من المشكله ...

#7
هويدي كتب:

طبعا أخى من الطبيعى أن يعطى لك خطأ FileNotFoundException ....

لتخزين ملف في قاعدة بيانات من تطبيق ويب يجب عليك عمل الأتى:

1- رفع محتويات الملف إلى الخادم

2- إستخدام محتويات الملف لتخزينها داخل قاعدة بيانات (أو داخل الخادم نفسه - ال File System الخاص به)

لكن ما تحاول أنت فعله هو الأتى:

1- الوصول من على الخادم لملف بنفس المسار الذي قام المستخدم بتحديده على العميل (و بالتالى FileNotFoundException ..)

أرجو أن تكون فهمت المغذي من المشكله ...

اولا انا بنت مو شب

بتشكرك كتير بس ما عندي ادنى فكرة عن الشي يلي حكيتو

رفع محتويات الملف الى الخادم استطعت تطبيقه

على الشكل التالي

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package s;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
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 java.sql.*;
import java.io.*;

/**
 *
 * @author 
 */
public class yes extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        DiskFileItemFactory factory = new DiskFileItemFactory();
	ServletFileUpload fileUpload = new ServletFileUpload(factory);
        //PreparedStatement psmnt = null;
        //FileInputStream fis;
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet yes</title>");  
            out.println("</head>");
            out.println("<body>");
            //String name = request.getParameter("Name");
            //String age = request.getParameter("Age");
            //String image = request.getParameter("fileToUpload");
            //Class.forName("com.mysql.jdbc.Driver");
            //Connection c= DriverManager.getConnection("jdbc:mysql://localhost/arabic?characterEncoding=UTF-8","root","");
            //Statement w = c.createStatement();
            //psmnt = c.prepareStatement("insert into test (name,age,image)value(?,?,?)");
            List listItems = fileUpload.parseRequest(request);
            	for (Object o : listItems) {
			FileItem fileItem = (FileItem)o;
			if (fileItem.isFormField()) {
				out.print(fileItem.getFieldName() + ": " + fileItem.getString() + "<br/>");
                                //psmnt.setString(1,name);
                                //psmnt.setString(2,age);
            		} else {
				fileItem.write(new File(getServletContext().getRealPath("/") + "/" + fileItem.getName()));
                                //File image1 =new File(getServletContext().getRealPath("/") + "/" + fileItem.getName());

                                //fis = new FileInputStream(image1);
                                //psmnt.setBinaryStream(3,(InputStream)fis, (int)(image.length()));
                                out.print("file uploaded successfully.");
			}
		}
            out.println("</body>");
            out.println("</html>");

        }
         catch (FileUploadException ex) {
			out.print("An error occured while processing the request: " + ex.getMessage());
		} catch (Exception ex) {
			out.print("An error occured while writing the uploaded file: " + ex.getMessage());
		}

        finally {
            out.close();
        }
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

ولكن كيف استطيع ان اخزن محتويات الملف داخل قاعدة اليبانات

#8

احصلى على اسم الملف وخزنيه فى قاعده البيانات عندك

لم تحجتيه

حطى المسار الاصلى للتخزين

وبعدين حطى اسم الملف

ولنعتقد ان مسار التخزين

www.something.com/upload/files

واسم الملف من قاعده البيانات هيجى كدا

مثلا كدا

image.jpg

هنفترض ان البيان هيرجع من قاعده البيانات كدا

String file = "image.jpg";

يقبى الصوره هيكون مسارها على الموقع كدا

String filePath = "www.something.com/upload/files" + file ;
1

Software Developer
Mahmoudkelany.com


 

#9

شكرا للجميع تم رفع الملفات وتخزينها في قاعدة البيانات

مواضيع مشابهة