免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
淘淘商城8.9

昨天忘記給大家說了個(gè)事,昨天添加FTP服務(wù)器依賴那部分我在搭建項(xiàng)目開始時(shí)就已經(jīng)在taotao-common的pom文件下寫好了,大家可以回去看看里面添加Apache組件那部分里面就有。

1、Nginx+FTP出現(xiàn)403錯(cuò)誤

還有就是訪問nginx下的ftp圖片會(huì)有我遇到的這個(gè)問題,如圖:


我不知道大家有沒有遇到,假如遇到也不知道大家是怎么去解決的,我把我的解決可以具體點(diǎn)寫出來。

1.1、錯(cuò)誤分析:

我看了下網(wǎng)上的關(guān)于這方面的相關(guān)資料,大概總結(jié)的兩個(gè)可能的原因:

1、缺少index.html或者index.php文件(索引文件)

2、權(quán)限問題

這是我nginx修改后的配置文件

因此我現(xiàn)在直接排除掉第一種情況。

怎么說呢。果然大部分原因還是會(huì)出現(xiàn)在第二種情況下,這就要我們需要去熟悉linux了,可憐的小伙伴們不知道學(xué)習(xí)的咋樣。先解決問題在討論學(xué)習(xí)方面吧。

1.2、錯(cuò)誤解決

一般這種情況我的是因?yàn)槭窃趓oot用戶下編譯的安裝及啟動(dòng)nginx的,會(huì)出現(xiàn)權(quán)限問題,沒跟ftp服務(wù)器所屬用戶一致導(dǎo)致。于是我就改變了nginx所屬的用戶和用戶組。

  1. root@cdh4>chmod 777 /home/ftpuser/www  
  2. root@cdh4>chown -R ftpuser:ftpuser /usr/local/nginx  
  3. root@cdh4>/usr/local/nginx/sbin/nginx -s reload  
之后在打開瀏覽器就可以訪問的到我昨天用測(cè)試代碼上傳的圖片了,地址:http://blog.csdn.net/sinat_31726559/article/details/52153330

如果還是不行就重啟一下機(jī)器,在關(guān)閉好iptables或者firewall就可以了

2、訪問Nginx圖片失真

上面雖然我們能夠訪問到圖片了,但是圖片卻存在失真的情況,這又是怎么一回事呢?

2.1、錯(cuò)誤分析

先看看昨天我寫的測(cè)試代碼


從上面可以看出我上傳到ftp服務(wù)器是以字節(jié)流傳輸?shù)?,到服?wù)器后是文本格式,而圖片是二進(jìn)制格式,所以上傳上去或出現(xiàn)編碼不能恢復(fù)到原來的圖片模樣。

2.2、錯(cuò)誤解決

知道錯(cuò)誤原因就好解決了,只要修改上傳文件的格式就行了,添加以下一句代碼就ok了

  1. //修改上傳文件格式  
  2. client.setFileType(FTP.BINARY_FILE_TYPE);  

將之前上傳的圖片先從服務(wù)器刪除,在用java代碼上傳一回


上傳ok,接著我們?cè)偎⑿乱幌聻g覽器看看效果。

呵呵,搞定!

3、項(xiàng)目所用到的FTP工具類

這里因?yàn)槭琼?xiàng)目中所用到的工具類??紤]到代碼的復(fù)用性,我就在taotao-common下新建的一個(gè)utils的工具類的包,如下:

工具類代碼如下:

代碼一

  1. package com.taotao.common.utils;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.OutputStream;  
  10.   
  11. import org.apache.commons.net.ftp.FTP;  
  12. import org.apache.commons.net.ftp.FTPClient;  
  13. import org.apache.commons.net.ftp.FTPFile;  
  14. import org.apache.commons.net.ftp.FTPReply;  
  15.   
  16. /** 
  17.  *  
  18.   * @ClassName: FtpUtil   
  19.   * @Description: TODO(ftp服務(wù)器的工具類)   
  20.   * @author 汪本成   
  21.   * @date 2016年8月9日 上午10:43:38   
  22.   * 
  23.  */  
  24. public class FtpUtil {  
  25.   
  26.     /**  
  27.      * Description: 向FTP服務(wù)器上傳文件  
  28.      * @param host FTP服務(wù)器hostname  
  29.      * @param port FTP服務(wù)器端口  
  30.      * @param username FTP登錄賬號(hào)  
  31.      * @param password FTP登錄密碼  
  32.      * @param basePath FTP服務(wù)器基礎(chǔ)目錄 
  33.      * @param filePath FTP服務(wù)器文件存放路徑。例如分日期存放:/2015/01/01。文件的路徑為basePath+filePath 
  34.      * @param filename 上傳到FTP服務(wù)器上的文件名  
  35.      * @param input 輸入流  
  36.      * @return 成功返回true,否則返回false  
  37.      */    
  38.     public static boolean uploadFile(String host, int port, String username, String password, String basePath,  
  39.             String filePath, String filename, InputStream input) {  
  40.         boolean result = false;  
  41.         FTPClient ftp = new FTPClient();  
  42.         try {  
  43.             int reply;  
  44.             ftp.connect(host, port);// 連接FTP服務(wù)器  
  45.             // 如果采用默認(rèn)端口,可以使用ftp.connect(host)的方式直接連接FTP服務(wù)器  
  46.             ftp.login(username, password);// 登錄  
  47.             reply = ftp.getReplyCode();  
  48.             if (!FTPReply.isPositiveCompletion(reply)) {  
  49.                 ftp.disconnect();  
  50.                 return result;  
  51.             }  
  52.             //切換到上傳目錄  
  53.             if (!ftp.changeWorkingDirectory(basePath+filePath)) {  
  54.                 //如果目錄不存在創(chuàng)建目錄  
  55.                 String[] dirs = filePath.split("/");  
  56.                 String tempPath = basePath;  
  57.                 for (String dir : dirs) {  
  58.                     if (null == dir || "".equals(dir)) continue;  
  59.                     tempPath += "/" + dir;  
  60.                     if (!ftp.changeWorkingDirectory(tempPath)) {  
  61.                         if (!ftp.makeDirectory(tempPath)) {  
  62.                             return result;  
  63.                         } else {  
  64.                             ftp.changeWorkingDirectory(tempPath);  
  65.                         }  
  66.                     }  
  67.                 }  
  68.             }  
  69.             //設(shè)置上傳文件的類型為二進(jìn)制類型  
  70.             ftp.setFileType(FTP.BINARY_FILE_TYPE);  
  71.             //上傳文件  
  72.             if (!ftp.storeFile(filename, input)) {  
  73.                 return result;  
  74.             }  
  75.             input.close();  
  76.             ftp.logout();  
  77.             result = true;  
  78.         } catch (IOException e) {  
  79.             e.printStackTrace();  
  80.         } finally {  
  81.             if (ftp.isConnected()) {  
  82.                 try {  
  83.                     ftp.disconnect();  
  84.                 } catch (IOException ioe) {  
  85.                 }  
  86.             }  
  87.         }  
  88.         return result;  
  89.     }  
  90.       
  91.     /**  
  92.      * Description: 從FTP服務(wù)器下載文件  
  93.      * @param host FTP服務(wù)器hostname  
  94.      * @param port FTP服務(wù)器端口  
  95.      * @param username FTP登錄賬號(hào)  
  96.      * @param password FTP登錄密碼  
  97.      * @param remotePath FTP服務(wù)器上的相對(duì)路徑  
  98.      * @param fileName 要下載的文件名  
  99.      * @param localPath 下載后保存到本地的路徑  
  100.      * @return  
  101.      */    
  102.     public static boolean downloadFile(String host, int port, String username, String password, String remotePath,  
  103.             String fileName, String localPath) {  
  104.         boolean result = false;  
  105.         FTPClient ftp = new FTPClient();  
  106.         try {  
  107.             int reply;  
  108.             ftp.connect(host, port);  
  109.             // 如果采用默認(rèn)端口,可以使用ftp.connect(host)的方式直接連接FTP服務(wù)器  
  110.             ftp.login(username, password);// 登錄  
  111.             reply = ftp.getReplyCode();  
  112.             if (!FTPReply.isPositiveCompletion(reply)) {  
  113.                 ftp.disconnect();  
  114.                 return result;  
  115.             }  
  116.             ftp.changeWorkingDirectory(remotePath);// 轉(zhuǎn)移到FTP服務(wù)器目錄  
  117.             FTPFile[] fs = ftp.listFiles();  
  118.             for (FTPFile ff : fs) {  
  119.                 if (ff.getName().equals(fileName)) {  
  120.                     File localFile = new File(localPath + "/" + ff.getName());  
  121.   
  122.                     OutputStream is = new FileOutputStream(localFile);  
  123.                     ftp.retrieveFile(ff.getName(), is);  
  124.                     is.close();  
  125.                 }  
  126.             }  
  127.   
  128.             ftp.logout();  
  129.             result = true;  
  130.         } catch (IOException e) {  
  131.             e.printStackTrace();  
  132.         } finally {  
  133.             if (ftp.isConnected()) {  
  134.                 try {  
  135.                     ftp.disconnect();  
  136.                 } catch (IOException ioe) {  
  137.                 }  
  138.             }  
  139.         }  
  140.         return result;  
  141.     }  
  142.       
  143.     public static void main(String[] args) {  
  144.         try {    
  145.             FileInputStream in=new FileInputStream(new File("D:\\temp\\image\\gaigeming.jpg"));    
  146.             boolean flag = uploadFile("192.168.25.133", 21, "ftpuser", "ftpuser", "/home/ftpuser/www/images","/2015/01/21", "gaigeming.jpg", in);    
  147.             System.out.println(flag);    
  148.         } catch (FileNotFoundException e) {    
  149.             e.printStackTrace();    
  150.         }    
  151.     }  
  152. }  

這個(gè)工具類的測(cè)試代碼就讓你們寫寫了,不會(huì)可以給我留言,及時(shí)給你答復(fù)
。

4、圖片上傳的實(shí)現(xiàn)

4.1、需求分析

Common.js

1、綁定事件,上傳圖片的組件

2、初始化參數(shù)

2、上傳圖片的url:

/pic/upload

3、上圖片參數(shù)名稱:

uploadFile

4、返回結(jié)果數(shù)據(jù)類型json

參考文檔:http://kindeditor.net/docs/upload.html

返回格式(JSON)

[javascript] view plain copy
print?
  1. //成功時(shí)  
  2. {  
  3.         "error" : 0,  
  4.         "url" : "http://www.example.com/path/to/file.ext"  
  5. }  
  6. //失敗時(shí)  
  7. {  
  8.         "error" : 1,  
  9.         "message" : "錯(cuò)誤信息"  
  10. }  
5、整個(gè)組建關(guān)鍵代碼

代碼二

[javascript] view plain copy
print?
  1. var TT = TAOTAO = {  
  2.     // 編輯器參數(shù)  
  3.     kingEditorParams : {  
  4.         //指定上傳文件參數(shù)名稱  
  5.         filePostName  : "uploadFile",  
  6.         //指定上傳文件請(qǐng)求的url。  
  7.         uploadJson : '/pic/upload',  
  8.         //上傳類型,分別為image、flash、media、file  
  9.         dir : "image"  
  10.     },  
  11.     // 格式化時(shí)間  
  12.     formatDateTime : function(val,row){  
  13.         var now = new Date(val);  
  14.         return now.format("yyyy-MM-dd hh:mm:ss");  
  15.     },  
  16.     // 格式化連接  
  17.     formatUrl : function(val,row){  
  18.         if(val){  
  19.             return "<a href='"+val+"' target='_blank'>查看</a>";            
  20.         }  
  21.         return "";  
  22.     },  
  23.     // 格式化價(jià)格  
  24.     formatPrice : function(val,row){  
  25.         return (val/1000).toFixed(2);  
  26.     },  
  27.     // 格式化商品的狀態(tài)  
  28.     formatItemStatus : function formatStatus(val,row){  
  29.         if (val == 1){  
  30.             return '正常';  
  31.         } else if(val == 2){  
  32.             return '<span style="color:red;">下架</span>';  
  33.         } else {  
  34.             return '未知';  
  35.         }  
  36.     },  
  37.       
  38.     init : function(data){  
  39.         // 初始化圖片上傳組件  
  40.         this.initPicUpload(data);  
  41.         // 初始化選擇類目組件  
  42.         this.initItemCat(data);  
  43.     },  
  44.     // 初始化圖片上傳組件  
  45.     initPicUpload : function(data){  
  46.         $(".picFileUpload").each(function(i,e){  
  47.             var _ele = $(e);  
  48.             _ele.siblings("div.pics").remove();  
  49.             _ele.after('\  
  50.                 <div class="pics">\  
  51.                     <ul></ul>\  
  52.                 </div>');  
  53.             // 回顯圖片  
  54.             if(data && data.pics){  
  55.                 var imgs = data.pics.split(",");  
  56.                 for(var i in imgs){  
  57.                     if($.trim(imgs[i]).length > 0){  
  58.                         _ele.siblings(".pics").find("ul").append("<li><a href='"+imgs[i]+"' target='_blank'><img src='"+imgs[i]+"' width='80' height='50' /></a></li>");  
  59.                     }  
  60.                 }  
  61.             }  
  62.             //給“上傳圖片按鈕”綁定click事件  
  63.             $(e).click(function(){  
  64.                 var form = $(this).parentsUntil("form").parent("form");  
  65.                 //打開圖片上傳窗口  
  66.                 KindEditor.editor(TT.kingEditorParams).loadPlugin('multiimage',function(){  
  67.                     var editor = this;  
  68.                     editor.plugin.multiImageDialog({  
  69.                         clickFn : function(urlList) {  
  70.                             var imgArray = [];  
  71.                             KindEditor.each(urlList, function(i, data) {  
  72.                                 imgArray.push(data.url);  
  73.                                 form.find(".pics ul").append("<li><a href='"+data.url+"' target='_blank'><img src='"+data.url+"' width='80' height='50' /></a></li>");  
  74.                             });  
  75.                             form.find("[name=image]").val(imgArray.join(","));  
  76.                             editor.hideDialog();  
  77.                         }  
  78.                     });  
  79.                 });  
  80.             });  
  81.         });  
  82.     },  
詳細(xì)的記得要查看我上面發(fā)給你的鏈接資料喲。

4.2、Service

功能:接收controller層傳遞過來的圖片對(duì)象,把圖片上傳到ftp服務(wù)器。給圖片生成一個(gè)新的名字,防止文件名重復(fù)。返回文件的url路徑。需要保證圖片上傳插件的數(shù)據(jù)方式。


這里有兩種實(shí)現(xiàn)方式:

1、創(chuàng)建一個(gè)pojo對(duì)象來實(shí)現(xiàn)

2、創(chuàng)建一個(gè)Map實(shí)現(xiàn)

這里我用Map實(shí)現(xiàn)。

Map中的內(nèi)容:

key                         Value                
Error1、0
URL圖片的url(成功時(shí))                          
Message錯(cuò)誤信息(失敗時(shí))

首先去service里面定義一個(gè)接口,為PictureService


代碼三

  1. package com.taotao.service;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.springframework.web.multipart.MultipartFile;  
  6.   
  7. /** 
  8.  *  
  9.   * @ClassName: PictureService   
  10.   * @Description: TODO(圖片上傳接口)   
  11.   * @author 汪本成   
  12.   * @date 2016年8月9日 下午12:01:27   
  13.   * 
  14.  */  
  15. public interface PictureService {  
  16.       
  17.     Map<?, ?> uploadFile(MultipartFile uploadFile);  
  18.   
  19. }  

對(duì)接口進(jìn)行實(shí)現(xiàn),但是實(shí)現(xiàn)時(shí)候我們得先整理好我們的思路。

1、對(duì)生成的文件名要保證能夠不進(jìn)行重復(fù),開始我想到的是UUID,但是感覺太長(zhǎng)了。就用一個(gè)生成id的工具類解決,代碼如下:

代碼四

  1. package com.taotao.common.utils;  
  2.   
  3. import java.util.Random;  
  4.   
  5. /** 
  6.  *  
  7.   * @ClassName: IDUtils   
  8.   * @Description: TODO(各種id生成策略)   
  9.   * @author 汪本成   
  10.   * @date 2016年8月9日 下午12:40:19   
  11.   * 
  12.  */  
  13. public class IDUtils {  
  14.   
  15.     /** 
  16.      * 圖片名生成 
  17.      */  
  18.     public static String genImageName() {  
  19.         //取當(dāng)前時(shí)間的長(zhǎng)整形值包含毫秒  
  20.         long millis = System.currentTimeMillis();  
  21.         //long millis = System.nanoTime();  
  22.         //加上三位隨機(jī)數(shù)  
  23.         Random random = new Random();  
  24.         int end3 = random.nextInt(999);  
  25.         //如果不足三位前面補(bǔ)0  
  26.         String str = millis + String.format("%03d", end3);  
  27.           
  28.         return str;  
  29.     }  
  30.       
  31.     /** 
  32.      * 商品id生成 
  33.      */  
  34.     public static long genItemId() {  
  35.         //取當(dāng)前時(shí)間的長(zhǎng)整形值包含毫秒  
  36.         long millis = System.currentTimeMillis();  
  37.         //long millis = System.nanoTime();  
  38.         //加上兩位隨機(jī)數(shù)  
  39.         Random random = new Random();  
  40.         int end2 = random.nextInt(99);  
  41.         //如果不足兩位前面補(bǔ)0  
  42.         String str = millis + String.format("%02d", end2);  
  43.         long id = new Long(str);  
  44.         return id;  
  45.     }  
  46.       
  47.     public static void main(String[] args) {  
  48.         for(int i=0;i< 100;i++)  
  49.         System.out.println(genItemId());  
  50.     }  
  51. }  
2、進(jìn)行圖片上傳時(shí),我們首先考慮到不能綁定死一個(gè)機(jī)器,在代碼中就決定或者說寫死這個(gè)機(jī)器信息,應(yīng)該在配置文件里進(jìn)行配置,在讀取配置文件信息會(huì)比較好,于是新建一個(gè)properties文件來記錄信息。這里我們絕對(duì)不能將這個(gè)配置文件寫到j(luò)ar包工程下,所以在taotao-manager-web工程下的resource文件夾下新建一個(gè)resource.properties文件來保存配置信息,如下:

代碼五

  1. #FTP相關(guān)配置  
  2. #FTP ip地址  
  3. FTP_IP=192.168.43.163  
  4. FTP_PORT=21  
  5. FTP_USERNAME=ftpuser  
  6. FTP_PASSWORD=115010  
  7. FTP_BASE_PATH=/home/ftpuser/www/images  
  8. #圖片服務(wù)器的相關(guān)配置  
  9. #圖片服務(wù)器的基礎(chǔ)url  
  10. IMAGE_BASE_URL=http://192.168.43.163/images  
  然后接下來考慮怎么讀取這個(gè)配置文件,到這步我們可以回憶一下之前我們是怎么讀取數(shù)據(jù)庫(kù)的配置文件db.properties的。spring給我們提供了完整的解決方案,不會(huì)的伙伴spring可得好好學(xué)了喲。考慮細(xì)節(jié),這里我就多說一點(diǎn)吧。

spring讀取信息這部分是在之前寫的xml文件里,這里我截個(gè)圖給大家看下大家就明白了。

然后就是spring讀取文件信息了,這里就要用到@Value("${文件的key字段}")這個(gè)知識(shí)點(diǎn)了,當(dāng)你在寫java代碼聲明這個(gè)字段的時(shí)候spring會(huì)給你自動(dòng)注入進(jìn)去的。好,直接來給大家寫好代碼,畢竟得要干貨嘛。

代碼六

  1. package com.taotao.service.impl;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6. import java.util.UUID;  
  7.   
  8. import org.joda.time.DateTime;  
  9. import org.springframework.beans.factory.annotation.Value;  
  10. import org.springframework.stereotype.Service;  
  11. import org.springframework.web.multipart.MultipartFile;  
  12.   
  13. import com.taotao.common.utils.FtpUtil;  
  14. import com.taotao.common.utils.IDUtils;  
  15. import com.taotao.service.PictureService;  
  16.   
  17. /** 
  18.  *  
  19.   * @ClassName: PictureServiceImpl   
  20.   * @Description: TODO(圖片上傳服務(wù))   
  21.   * @author 汪本成   
  22.   * @date 2016年8月9日 下午12:02:33   
  23.   * 
  24.  */  
  25. @Service  
  26. public class PictureServiceImpl implements PictureService {  
  27.       
  28.     //注入resource.properties的Key字段  
  29.     @Value("${FTP_IP}")  
  30.     private String FTP_IP;  
  31.     @Value("${FTP_PORT}")  
  32.     private Integer FTP_PORT;  
  33.     @Value("${FTP_USERNAME}")  
  34.     private String FTP_USERNAME;  
  35.     @Value("${FTP_PASSWORD}")  
  36.     private String FTP_PASSWORD;  
  37.     @Value("${FTP_BASE_PATH}")  
  38.     private String FTP_BASE_PATH;  
  39.     @Value("${IMAGE_BASE_URL}")  
  40.     private String IMAGE_BASE_URL;  
  41.       
  42.     @Override  
  43.     public Map<?, ?> uploadFile(MultipartFile uploadFile) {  
  44.         Map resultMap = new HashMap<>();  
  45.         try {  
  46.         //生成一個(gè)新的文件名  
  47.         //取原始文件名  
  48.         String oldName = uploadFile.getOriginalFilename();  
  49.           
  50.         //生成新文件名  
  51.         //UUID.randomUUID();  
  52.         String newName = IDUtils.genImageName();  
  53.         newName = newName + oldName.substring(oldName.lastIndexOf("."));  
  54.           
  55.         //圖片上傳  
  56.         String imagePath = new DateTime().toString("/yyyy/MM/dd");  
  57.         boolean result = FtpUtil.uploadFile(FTP_IP, FTP_PORT, FTP_USERNAME, FTP_PASSWORD, FTP_BASE_PATH,  
  58.                 imagePath, newName, uploadFile.getInputStream());  
  59.           
  60.         //返回結(jié)果  
  61.         if(!result) {  
  62.             resultMap.put("error", 1);  
  63.             resultMap.put("message", "文件上傳失敗");  
  64.             return resultMap;  
  65.               
  66.         }  
  67.         resultMap.put("error", 0);  
  68.         resultMap.put("url", IMAGE_BASE_URL + imagePath + "/" + newName);  
  69.         return resultMap;  
  70.           
  71.         } catch (IOException e) {  
  72.             resultMap.put("error", 1);  
  73.             resultMap.put("message", "文件上傳異常");  
  74.             return resultMap;  
  75.         }  
  76.           
  77.     }  
  78.   
  79. }  

4.3、Controller

功能:接收頁面?zhèn)鬟f過來的圖片。調(diào)用service上傳到圖片服務(wù)器。返回結(jié)果。

參數(shù):MultiPartFileuploadFile

返回值:返回json數(shù)據(jù),應(yīng)該返回一個(gè)pojo,PictureResult對(duì)象。

代碼七

  1. package com.taotao.controller;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.stereotype.Controller;  
  7. import org.springframework.web.bind.annotation.RequestMapping;  
  8. import org.springframework.web.bind.annotation.ResponseBody;  
  9. import org.springframework.web.multipart.MultipartFile;  
  10.   
  11. import com.taotao.service.PictureService;  
  12.   
  13. @Controller  
  14. public class PictureController {  
  15.   
  16.     @Autowired  
  17.     private PictureService pictureService;  
  18.       
  19.     @RequestMapping("/pic/upload")  
  20.     @ResponseBody  
  21.     public Map<?, ?> pictureUpload(MultipartFile uploadFile) {  
  22.         Map<?, ?> result = pictureService.uploadFile(uploadFile);  
  23.         return result;  
  24.     }  
  25. }  

然后更新一下taotao-common這個(gè)工程。啟動(dòng)taotao-manager,點(diǎn)擊上傳圖片。

4.4、圖片上傳異常


控制臺(tái)輸出一下異常信息:

錯(cuò)誤分析:缺少配置文件

錯(cuò)誤解決:1、需要引入file-up;oad和common-io包;

                 2、在springmvc.xml中配置多部件解析器,添加如下內(nèi)容。

代碼八

  1. <!-- 定義文件上傳解析器 -->  
  2.     <bean id="multipartResolver"  
  3.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
  4.         <!-- 設(shè)定默認(rèn)編碼 -->  
  5.         <property name="defaultEncoding" value="UTF-8"></property>  
  6.         <!-- 設(shè)定文件上傳的最大值5MB,5*1024*1024 -->  
  7.         <property name="maxUploadSize" value="5242880"></property>  
  8.     </bean>  


之后重啟taotao-manager,打開qq瀏覽器,測(cè)試下,發(fā)現(xiàn)好使,如圖:

但是很遺憾,在火狐瀏覽器上卻失敗了

這是為什么呢,我覺得這就是插件本身的兼容性問題。但是問題出來了我們必須得解決呀,怎么解決呢?

這里就要換個(gè)思路,統(tǒng)一換成利用json數(shù)據(jù)來返回就ok。這里我就寫個(gè)json的工具類放到taotao-common下。

代碼九

  1. package com.taotao.common.utils;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.fasterxml.jackson.core.JsonProcessingException;  
  6. import com.fasterxml.jackson.databind.JavaType;  
  7. import com.fasterxml.jackson.databind.ObjectMapper;  
  8.   
  9. /** 
  10.  *  
  11.   * @ClassName: JsonUtils   
  12.   * @Description: TODO(淘淘商城自定義響應(yīng)結(jié)構(gòu))   
  13.   * @author 汪本成   
  14.   * @date 2016年8月10日 上午1:32:37   
  15.   * 
  16.  */  
  17. public class JsonUtils {  
  18.   
  19.     // 定義jackson對(duì)象  
  20.     private static final ObjectMapper MAPPER = new ObjectMapper();  
  21.   
  22.     /** 
  23.      * 將對(duì)象轉(zhuǎn)換成json字符串。 
  24.      * <p>Title: pojoToJson</p> 
  25.      * <p>Description: </p> 
  26.      * @param data 
  27.      * @return 
  28.      */  
  29.     public static String objectToJson(Object data) {  
  30.         try {  
  31.             String string = MAPPER.writeValueAsString(data);  
  32.             return string;  
  33.         } catch (JsonProcessingException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.         return null;  
  37.     }  
  38.       
  39.     /** 
  40.      * 將json結(jié)果集轉(zhuǎn)化為對(duì)象 
  41.      *  
  42.      * @param jsonData json數(shù)據(jù) 
  43.      * @param clazz 對(duì)象中的object類型 
  44.      * @return 
  45.      */  
  46.     public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {  
  47.         try {  
  48.             T t = MAPPER.readValue(jsonData, beanType);  
  49.             return t;  
  50.         } catch (Exception e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.         return null;  
  54.     }  
  55.       
  56.     /** 
  57.      * 將json數(shù)據(jù)轉(zhuǎn)換成pojo對(duì)象list 
  58.      * <p>Title: jsonToList</p> 
  59.      * <p>Description: </p> 
  60.      * @param jsonData 
  61.      * @param beanType 
  62.      * @return 
  63.      */  
  64.     public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {  
  65.         JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);  
  66.         try {  
  67.             List<T> list = MAPPER.readValue(jsonData, javaType);  
  68.             return list;  
  69.         } catch (Exception e) {  
  70.             e.printStackTrace();  
  71.         }  
  72.           
  73.         return null;  
  74.     }  
  75.       
  76. }  

然后再修改一下我們寫的controller就行了

代碼十

  1. package com.taotao.controller;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.stereotype.Controller;  
  7. import org.springframework.web.bind.annotation.RequestMapping;  
  8. import org.springframework.web.bind.annotation.ResponseBody;  
  9. import org.springframework.web.multipart.MultipartFile;  
  10.   
  11. import com.taotao.common.utils.JsonUtils;  
  12. import com.taotao.service.PictureService;  
  13.   
  14. /** 
  15.  *  
  16.   * @ClassName: PictureController   
  17.   * @Description: TODO(圖片上傳的controller)   
  18.   * @author 汪本成   
  19.   * @date 2016年8月10日 上午1:33:32   
  20.   * 
  21.  */  
  22. @Controller  
  23. public class PictureController {  
  24.   
  25.     @Autowired  
  26.     private PictureService pictureService;  
  27.       
  28.     @RequestMapping("/pic/upload")  
  29.     @ResponseBody  
  30.     public String pictureUpload(MultipartFile uploadFile) {  
  31.         Map<?, ?> result = pictureService.uploadFile(uploadFile);  
  32.           
  33.         //為了保證兼容性,需要把Result轉(zhuǎn)換成json格式的字符串  
  34.         String json = JsonUtils.objectToJson(result);  
  35.           
  36.         return json;  
  37.     }  
  38. }  

然后啟動(dòng)進(jìn)行測(cè)試:


ok,完美解決圖片上傳問題,明天繼續(xù)開發(fā)









本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
jedis封裝Dao層
Spring 注解學(xué)習(xí)手札(三) 表單頁面處理
vue 文件上傳組件vue
spring和hessian整合
Android FTP服務(wù)器上傳 Android FTP服務(wù)器上傳文件攻略(代碼詳解)
FTPClient 用法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服