2011-12-08 61 views
14

Tôi có một bảng nào đó trong mySQL có một trường được gọi là "hình ảnh" với kiểu dữ liệu "BLOB". Tôi đã tự hỏi nếu nó có thể tải lên một hình ảnh trong lĩnh vực đó trực tiếp từ khách hàng dòng lệnh hơn là làm nó thông qua php ... Nếu có thể, thì chính xác nơi tôi nên đặt các tập tin hình ảnh của tôi?Tải hình ảnh trực tiếp qua MySQL Command Line

Trả lời

21

Thử sử dụng chức năng LOAD_FILE().

UPDATE `certain_table` 
SET image = LOAD_FILE('/full/path/to/new/image.jpg') 
WHERE id = 1234; 

Xem hướng dẫn cho các yêu cầu về đường dẫn đến tên tập tin, đặc quyền, vv

3

tôi khuyên bạn nên không bao giờ tải lên hình ảnh trực tiếp trong một cơ sở dữ liệu, nó khá hiệu quả. Tốt hơn là chỉ cần lưu trữ vị trí và tên của hình ảnh và lưu trữ những hình ảnh đó trong một thư mục ở đâu đó.

và nếu bạn muốn "tải lên" qua dòng lệnh, bạn chỉ có thể làm một:

insert into table(image_loc) values('/images/random/cool.jpg') where id=1; 

và tùy thuộc vào môi trường của bạn, bạn có thể sử dụng truy cập vỏ để di chuyển hình ảnh xung quanh. Tôi không hoàn toàn chắc chắn những gì bạn đang cố gắng làm với những hình ảnh này hoặc làm thế nào hệ thống của bạn được thiết lập. Có thể bạn sẽ cần phải làm rõ về điều đó.

+1

Tôi đã đọc rất nhiều cuộc thảo luận trực tuyến về vấn đề này ... và tôi làm hỗ trợ quan điểm của bạn chống lại nó, nhưng khá thẳng thắn tôi không tìm thấy đủ tài liệu về cách thức hoạt động của quy trình này .... vì vậy tôi đã miễn cưỡng tiếp cận nó. Nếu bạn có bất kỳ liên kết trong tâm trí, nó sẽ là tuyệt vời nếu bạn có thể gửi chúng ở đây! :) – BurninatorDor

+0

@BurninatorDor bạn sử dụng ngôn ngữ nào với mysql? Nó đơn giản như thực hiện lệnh sql để lấy chuỗi vị trí từ cơ sở dữ liệu và mở tệp này bằng ngôn ngữ của bạn. Cá nhân tôi nghĩ rằng việc sử dụng load_file gây rắc rối hơn nhiều. – mugetsu

+0

Có, load_file() không hoạt động trong trường hợp của tôi vì vậy bây giờ tôi đang lên kế hoạch truy xuất hình ảnh từ hệ thống. Tôi sẽ tạo một dịch vụ web trong C#, nó sẽ lấy vị trí của tập tin từ cơ sở dữ liệu mysql ... Đây chỉ là backend mặc dù .... giao diện người dùng hoàn toàn bằng HTML5 + CSS3 + JavaScript. Vì vậy, tôi đoán tôi sẽ phải tìm kiếm các nguồn lực mà sẽ giúp tôi tải một hình ảnh từ một địa chỉ nhất định trong JavaScript có thể? Cảm ơn bạn đã giúp đỡ của bạn anyways ... – BurninatorDor

0

Sẽ thích hợp hơn khi xây dựng một ứng dụng mẫu và sau đó chèn các giá trị vào cơ sở dữ liệu. Ví dụ phương pháp này có thể được sử dụng để nhập một datatype BLOB vào cơ sở dữ liệu ...

[WebMethod] 
       public string sendDataToMySql(string get_name, byte[] buffer) 
       { 
        string MyConString = "SERVER=localhost;" + 
          "DATABASE=test;" + 
          "UID=root;" + 
          "PASSWORD=admin;"; 


        MySqlConnection connection = new MySqlConnection(MyConString); 
        connection.Open(); 
        MySqlCommand command = new MySqlCommand("", connection); 
        command.CommandText = "insert into testImage(name, image) values(@name, @image);"; 


        MySqlParameter oParam1 = command.Parameters.Add("@name", MySqlDbType.VarChar, 50); 
        oParam1.Value = get_name; 


        MySqlParameter oParam2 = command.Parameters.Add("@image", MySqlDbType.Blob); 
        oParam2.Value = buffer; 

        command.ExecuteNonQuery(); 

        connection.Close(); 
        return "Data was inserted successfully!"; 
        } 
3

LOAD_FILE chỉ hoạt động với quyền nhất định và nếu tập tin trên máy chủ. Tôi đã phát hiện ra một cách để làm cho nó hoạt động hoàn toàn phía khách hàng:

mysql -e "update mytable set image=FROM_BASE64('`base64 -i image.png`')" DBNAME 

Ý tưởng là mã hóa hình ảnh thành base64 ngay lập tức và để MySql giải mã nó.

1

Đây là một biến thể của câu trả lời Teudimundo 's làm việc với phiên bản MySQL cũ, nơi mà chức năng Base64 không có sẵn:

mysql -e "update mytable set col = x'$(xxd -p image.png | tr -d \\n)' where ..." 

Bí quyết là sử dụng xxd -p để chuyển đổi một tập tin nhị phân để một đồng bằng hexdump:

$ xxd -p /usr/share/font-manager/data/blank.png 
89504e470d0a1a0a0000000d4948445200000040000000400806000000aa 
6971de000000274944415478daedc1010d000000c220fba77e0e37600000 
00000000000000000000000000c0bd0040400001ee1dbb2f000000004945 
4e44ae426082 

sau đó sử dụng tr -d \\n để loại bỏ các dòng mới, và cuối cùng là nhúng kết quả vào một chuỗi hexdump MySQL cụ thể theo nghĩa đen: x'...'

0

Thỉnh thoảng chúng tôi cố gắng tải lên tệp bằng tệp tải nhưng tệp không được tải hoặc đường dẫn tệp trong văn bản được định dạng được lưu trữ trong trường BLOB. Điều này là do các vấn đề truy cập. Nếu bạn đang gặp phải tình trạng như vậy, thay vì tải tệp từ bất kỳ vị trí nào, hãy thử tải nó từ đường dẫn dữ liệu của mysql tốt hơn là:

INSERT INTO `srms`.`images` (`ID`, `Image`) VALUES ('5', load_file('C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\test.jpg')); 
Các vấn đề liên quan