天天看點

2021-09-09商品新增(圖檔上傳)代理機制 Nginx關于商品新增檔案子產品說明 代理機制Nginx官網下載下傳

關于商品新增檔案子產品說明

  1. 使用者點選添加商品按鈕時,首先擷取分類三級清單資訊,跳轉到商品新增頁面
  2. 使用者登入基本的商品資訊
  3. 使用者錄入價格時,需要再後期将資料擴大100倍

商品上傳

  1. 當使用者點選上傳圖檔時,根據屬性名稱file=“圖檔位元組資訊“,實作資料的傳遞。
  2. 後端通過特定的接口MultipartFile(mvc專門接收位元組資訊,内部封裝io流)
  3. 上傳檔案時,首先正規表達式判斷檔案類型 .jpg.png.git
  4. 要判斷圖檔是否為木馬病毒,對于圖檔 ImageIO.read(file.getInputStream()) 進行高和寬的判斷,如果有一個為0則上傳的不是圖檔。
  5. 将上傳的圖檔進行分目錄存儲,采取政策按照時間日期進行的目錄分割
  6. 為了防止檔案命名重複,采用UUid的方式重新定義檔案名稱
  7. 最終實作檔案上傳,傳回特定的vo資料 供前端展現

商品詳情

  1. 通常商品資訊和詳情資訊是分開維護的.由于商品詳情是大字段(文本域),查詢的效率低.
  2. 商品表與詳情表是一對一的對應關系. 設計時 item.id=itemDesc.id.
  3. 之後利用富文本編輯器(所見即所得),展現詳情資訊,其中存儲的是html代碼片段.
@Service
public class FileServiceImpl implements FileService{
    //封裝路徑的字首
    private String localDir = "G:/images";
    private String preUrl = "http://image.jt.com";

    /**
     * 完成校驗:
     *  1.校驗是否為圖檔
     *  2.木馬.exe.jpg 判斷是否滿足圖檔固有屬性 高度/寬度
     *  3.為了提高查詢效率,要求分目錄存儲.
     *      3.1 按照字尾名配置設定  jpg,png,gif 效率提升不能滿足要求
     *      3.2 按照日期分   yyyy/MM/dd/HH   可以
     *      3.3 商品分類     出現分布不均現象.
     *      3.4 根據名稱hash 之後截串
     *          demo: hash(a)=qw|er|as|dg/a.jpg
     *          弊端: hash碼可能出現分布不均的現象.
     *  4.防止檔案重名  使用uuid代替名稱
     * @param file
     * @return
     */
    @Override
    public ImageVO upload(MultipartFile file) {
        //1.擷取圖檔名稱    demo: abc.jpg  abc.JPG
        String fileName = file.getOriginalFilename();
        //bug說明: 由于windows系統不區分大小寫,是以将字母全部轉化為小寫
        fileName = fileName.toLowerCase();
        //利用正則判斷是否為圖檔.
        if(!fileName.matches("^.+\\.(jpg|png|gif)$")){
            //如果不是圖檔,則傳回null
            return null;
        }

        //2.檢查檔案是否為惡意程式.
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();
            if(width == 0 || height == 0){
                //說明檔案不是圖檔.
                return null;
            }

            //3.根據時間實作目錄的建立 時間--yyyy/MM/dd
            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
                            .format(new Date());
            // "G:/images/2021/11/11
            String localDirPath = localDir + dateDir;
            //建立目錄
            File dirFile = new File(localDirPath);
            if(!dirFile.exists()){
                dirFile.mkdirs();
            }

            //4. 使用uuid替換檔案名稱 唯一:系統内部唯一
            String uuid = UUID.randomUUID().toString()
                    .replace("-","");
            //截取檔案的字尾  aa.bb.cc.jpg
            int index = fileName.lastIndexOf(".");
            //擷取類型  .jpg
            String fileType = fileName.substring(index);
            String newFileName = uuid + fileType;

            //5.實作檔案上傳操作  目錄/檔案名稱
            String realFilePath = localDirPath + newFileName;
            file.transferTo(new File(realFilePath));
            System.out.println("檔案上傳成功!!!");

            /*
             *  6.封裝傳回值
             *  封裝虛拟路徑 在各個系統之間可以靈活切換,隻儲存動态變化的目錄
             *  path = 時間/uuid.type
             *  網絡位址://http://image.jt.com/2021/11/11/a.jpg
             */
            String virtualPath = dateDir + newFileName;
            String url = preUrl + virtualPath;
            System.out.println("磁盤位址:"+realFilePath);
            System.out.println("網絡位址:"+url);
            return new ImageVO(virtualPath,url,newFileName);

        } catch (IOException e) {
            e.printStackTrace();
            return null;    //表示程式有問題
        }
    }

    /**
     * 實作思路:
     *      1.根據虛拟位址,拼接磁盤位址
     *      2.判斷檔案是否存在
     *      3.實作檔案删除
     * @param virtualPath
     */
    @Override
    public void deleteFile(String virtualPath) {
        //1.生成本地磁盤位址
        String path = localDir + virtualPath;
        System.out.println(path);
        File file = new File(path);
        if(file.exists()){
            file.delete();
        }
    }
}
           

如果路徑資訊會發生變化,則最好的方式通過動态指派的方式完成.

編輯image.properties檔案

#通過配置檔案 動态指派

image.localDir=G:/images

image.preUrl=http://image.jt.com

2021-09-09商品新增(圖檔上傳)代理機制 Nginx關于商品新增檔案子產品說明 代理機制Nginx官網下載下傳

 代理機制

使用者如果直接通過網絡位址進行通路,是無法直接擷取圖檔資訊的,如果需要擷取圖檔應該實作域名與位址的映射

反向代理:

  • 反向代理伺服器位于使用者和伺服器之間
  • 使用者通路反向代理伺服器,就可以擷取真實的資源
  • 反向代理機制,使用者無需了解真實的伺服器資訊
  • 反向代理保護了伺服器端資訊,也稱之為伺服器代理

正向代理:

1.正向代理伺服器位于使用者和伺服器之間.

2. 使用者發起請求時,非常明确自己通路的伺服器到底是誰

3. 真實的伺服器不清楚真實的使用者是誰.保護了使用者的資訊.

是以稱之為用戶端代理.

:使用者每一次請求都包含了正向代理和反向代理.

正向代理一般适用于網絡的通信.

反向代理一般适用于伺服器擷取資訊.

 Nginx介紹

Nginx (engine x) 是一個高性能的HTTP和反向代理web伺服器,俄羅斯

  •  Nginx是非常優秀的反向代理伺服器
  •  Nginx占用記憶體小,不到2M  tomcat伺服器占用記憶體200M左右
  • 并發負載能力強3-5萬次每秒,tomcat并發能力250-500次每秒,進行調優可以實作1000次每秒
  • nignx可以當作負載均衡伺服器使用

Nginx官網下載下傳

nginx啟動時會預設占用80端口

啟動關閉

關于啟動2項說明:

在windows中nginx服務每次點選啟動之後,都會生成2個程序項

程序項1: nginx主要程序資訊.

程序項2: nginx的守護程序 主要的任務防止主程序意外關閉.

關閉nginx 應該先關閉守護(記憶體曉得)再關閉主程序(記憶體大的).

指令:

1. 啟動指令 start nginx

2. 重新開機指令 nginx -s reload

3. 關閉指令 nginx -s stop

業務說明

磁盤位址:G:/images/2021/09/09/a.jpg

網絡位址:http://image.jt.com/2021/09/09/a.jpg

問題: 如何通過網絡位址通路磁盤的圖檔?

1.使用者通過域名通路真實的伺服器.

2.nginx根據自身的配置進行攔截,根據配置檔案将域名http://image.jt.com轉化為具體的磁盤位址

3.根據磁盤位址通路真實的伺服器資源.

4/5. 伺服器将資料交給nginx,之後nginx将資料傳回給使用者.至此實作了反向代理.

修改hosts檔案

路徑: C:\Windows\System32\drivers\etc

#  IP 與   域名映射

#    127.0.0.1       localhost

#    ::1             localhost

#圖檔伺服器配置

127.0.0.1       image.jt.com

#前端伺服器配置

127.0.0.1       www.jt.com

#後端伺服器配置

127.0.0.1       manage.jt.com

繼續閱讀