問題描述:
在做商城項目時,上傳圖片用於搜索時顯示頭圖,當上傳單張圖片時可以正常顯示,上傳多張圖片時不現實頭圖
報錯信息:
訪問圖片報400錯誤
原因分析:
當有多張圖片上傳時,因爲使用了solr的原因,多圖片地址使用json格式寫在一起。當取出圖片時,取出的地址爲String,String中可能存在多個使用逗號隔開的圖片地址,這時直接使用此String作爲圖片地址會產生錯誤,從而得不到正確的頭圖
"images":["http://192.168.25.131/group1/M00/00/00/wKgZg1qdGIGAImsLAAK1asSSzZc991.jpg","http://192.168.25.131/group1/M00/00/00/wKgZg1qdGIGALTovAAT9Jeh1RYQ412.jpg"]
解決方法:
- 方法一:將頭圖和詳情顯示的多圖分開存入數據庫
- 方法二:商品上傳到solr索引庫時,只上傳頭圖
- 方法三:取到solr索引庫中的圖片地址後,再取其中的一張作爲頭圖
方法一的缺點時增加了數據庫的負擔和操作的複雜性
方法二和方法三上傳的地址都是字符串,對數據庫的操作沒有改變,因爲考慮到熱點商品高併發訪問的問題,需要用到redis緩存數據,緩存的商品數據越少越好,減輕服務器的壓力。綜合考慮可以選擇方法二進行頭圖顯示。
修改上傳solr索引庫的商品圖片爲n個圖片的第一個
public String getImage() {
String img = image;
try {
String[] images = img.split(",");
String image = images[0];
return image;
} catch (Exception e) {
e.printStackTrace();
}
return image;
}
上傳商品信息到索引庫
public Result ImportItemsToIndex() {
try {
//1、查詢商品列表
List<SearchItem> itemList = itemMapper.getItemList();
//2、遍歷添加
for (SearchItem searchItem : itemList) {
//2.1、新建文檔對象
SolrInputDocument document = new SolrInputDocument();
//2.2、向文檔中添加域
document.addField("id", searchItem.getId());
document.addField("item_title", searchItem.getTitle());
document.addField("item_sell_point", searchItem.getSell_point());
document.addField("item_price", (long)searchItem.getPrice());
document.addField("item_image", searchItem.getImage());
document.addField("item_category_name", searchItem.getCategory_name());
document.addField("item_desc", searchItem.getItem_desc());
//2.3、把文檔寫入索引庫
solrServer.add(document);
}
//3、提交
solrServer.commit();
} catch (Exception e) {
e.printStackTrace();
Result.build(500, "數據導入失敗!");
}
更新索引庫(刪除之後再上傳,或者使用ActiveMq實現)
索引庫更新後,再上傳就不會出現問題了