中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Nginx代理輸出縮放圖片怎么實現

發布時間:2022-06-02 11:23:12 來源:億速云 閱讀:139 作者:zzz 欄目:大數據

本篇內容介紹了“Nginx代理輸出縮放圖片怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

nginx 配置文件:

# document ppt convert configuration.
upstream document.polyv.net {
 server 127.0.0.1:8080;
}

server {
 listen 80;
 server_name document.polyv.net;
 index index.html index.htm;
 charset utf-8;
 client_max_body_size 1000m;

 # ignore favicon.ico not exist.
 location = /favicon.ico {
  log_not_found off;
  access_log off;
 }

 # not allow to visit hidden files.
 location ~ /\. {
  deny all;
  access_log off;
  log_not_found off;
 }

 location / {
  if ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$) {
   add_header content-disposition: 'attachment;';
   add_header content-type: 'application/octet-stream';
  }

  proxy_pass http://document.polyv.net;
  proxy_set_header x-real-ip $remote_addr;
  proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
  proxy_set_header request_host $host;

  # include proxy.conf;
  charset utf-8;
 }

 # user upload files
 location /images/ {
   #expires 7d;
  alias /data03/ovp/blobs/;
   proxy_store on;
   proxy_store_access user:rw group:rw all:rw;
   proxy_set_header accept-encoding "";
   if ( !-f $request_filename ) {
    proxy_pass http://document.polyv.net;
   }
 }

 location /blobs/ {
   #expires 7d;
  alias /data03/ovp/blobs/;
 }

  location /preview/images/ {
   #expires 7d;
   alias /data03/ovp/blobs/;
   proxy_store on;
   proxy_store_access user:rw group:rw all:rw;
   proxy_set_header accept-encoding "";
   if ( !-f $request_filename ) {
    proxy_pass http://document.polyv.net;
   }
  }

}

代理輸出縮放圖片

package com.document.handle.controller;

import java.io.bufferedinputstream;
import java.io.file;
import java.io.ioexception;
import java.io.outputstream;
import java.net.httpurlconnection;
import java.net.url;

import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;

import org.apache.commons.lang3.stringutils;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.stereotype.controller;
import org.springframework.web.bind.servletrequestutils;
import org.springframework.web.bind.annotation.pathvariable;
import org.springframework.web.bind.annotation.requestmapping;

import com.document.tool.imagemagickutils;
import com.document.tool.systemconfig;

@controller
public class imageagentcontroller {

 private static final logger log = loggerfactory.getlogger(imageagentcontroller.class);

 /**
  * ppt預覽圖片代理輸出
  * @throws ioexception
  */
 @requestmapping("/preview/images/{year}/{month}/{md5id}/{preview}/{filename}.{ext}")
 public void cropimage(@pathvariable string year, @pathvariable string month, @pathvariable string md5id,
   @pathvariable string preview, @pathvariable string filename, @pathvariable string ext,
   httpservletrequest request, httpservletresponse response) throws ioexception {
  // string rootdir = "/data03/ovp/blobs/";
  string rootdir = systemconfig.getblobdirectory();
  string oname = filename.substring(1, filename.length());// 原圖文件名
  string dirstring = rootdir + year + "/" + month + "/" + md5id + "/" + oname + "." + ext;
  string targetfilestring = rootdir + year + "/" + month + "/" + md5id + "/preview/" + filename + "." + ext;

  //如果原圖存在
  file originimage = new file(oname);
  if(originimage.exists()){
   log.info("corpimage..." + dirstring + " -> " + targetfilestring);
   file newfile = new file(targetfilestring);
   string pathstring = newfile.getparent();
   log.info("pathstring...{} {}", pathstring);
   file pathfile = new file(pathstring);
   if (!pathfile.exists()) {
    log.info("---create file---");
    pathfile.mkdirs();
   }
   boolean status = imagemagickutils.scale(dirstring, targetfilestring, 240, 180);
   if (status) {
    response.reset();
    response.setcontenttype("image/" + ext);

    java.io.inputstream in = new java.io.fileinputstream(targetfilestring);
    // filenameurlutils.getimagefilename(targetfilestring);

    if (in != null) {
     byte[] b = new byte[1024];
     int len;
     while ((len = in.read(b)) != -1) {
      response.getoutputstream().write(b);
     }

     in.close();
    }
   }
  }else{
   log.info("原圖目錄不存在-preview:{}",dirstring); 
  }
 }


 /**
  * ppt固定尺寸圖片代理輸出
  * @throws ioexception
  * https://cache.yisu.com/upload/ask_collection/20210726/113/19154.png
  *
  * http://document.polyv.net/images/2016/03/de37d2ceb11ac068c18c5e4428541075/jpg-3.png
  */
 @requestmapping("/images/{year}/{month}/{md5id}/{filename}/{width}x{height}.{ext}")
 public void cropfixedimage(@pathvariable string year, @pathvariable string month, @pathvariable string md5id,
   @pathvariable string filename, @pathvariable integer width, @pathvariable integer height, @pathvariable string ext,
   httpservletrequest request, httpservletresponse response) throws ioexception {
  // string rootdir = "/data03/ovp/blobs/";
  string rootdir = systemconfig.getblobdirectory();
  //string oname = filename.substring(1, filename.length());// 原圖文件名
  string dirstring = rootdir + year + "/" + month + "/" + md5id + "/" + ( filename + "." + ext);
  string targetfilestring = rootdir + year + "/" + month + "/" + md5id + "/" + filename + "/" + (width + "x" + height + "." + ext);

  //如果原圖存在
  file originimage = new file(dirstring);
  if(originimage.exists()){
   file targetfilestringfile = new file(targetfilestring);
   if(!targetfilestringfile.exists()){
    log.info("corpimage..." + dirstring + " -> " + targetfilestring);
    file newfile = new file(targetfilestring);
    string pathstring = newfile.getparent();
    log.info("pathstring...{} {}", pathstring);
    file pathfile = new file(pathstring);
    if (!pathfile.exists()) {
     log.info("---create file---");
     pathfile.mkdirs();
    }
    imagemagickutils.resizewh(dirstring, targetfilestring,width,height);
   }
   response.setcontenttype("image/" + ext);
   java.io.inputstream in = null;
   try{
    in = new java.io.fileinputstream(targetfilestring);
    response.setcontentlength(in.available());
    byte[] buffer = new byte[1024];
    int count = 0;
    while ((count = in.read(buffer)) > 0) {
     response.getoutputstream().write(buffer, 0, count);
    }
    response.flushbuffer();
   }catch(exception e){
    e.printstacktrace();
   }finally {
    try {
     in.close();
    } catch (exception e) {

    }
   }
  }else{
   log.info("原圖目錄不存在:{}",dirstring);
  }




 }


 /**
  * 圖片下載
  */
 @requestmapping("get/image/data")
 public void downloadimage(httpservletrequest request, httpservletresponse response) throws ioexception { 
  string filepath = servletrequestutils.getstringparameter(request, "filepath", ""); //圖片訪問路勁
  string filename = servletrequestutils.getstringparameter(request, "filename", ""); //名稱

  if(stringutils.isnotblank(filepath) || stringutils.isnotblank(filename)){
   string desturl = filepath;
   //log.info("--------------"+filepath); 
   string fileformat=filepath.substring(filepath.lastindexof("."));
   //string name=filename.trim()+fileformat;
   string name=filepath.substring(filepath.lastindexof("/")+1, filepath.length()); 
   //file f = new file(filepath);
   //response.setheader("content-disposition", "attachment; filename="+java.net.urlencoder.encode(f.getname(),"utf-8")); 
   //log.info("--------------"+f.getname());

   // 建立鏈接 
   url url = new url(desturl); 
   httpurlconnection httpurl = (httpurlconnection) url.openconnection(); 
   // 連接指定的資源 
   httpurl.connect(); 
   // 獲取網絡輸入流 
   bufferedinputstream bis = new bufferedinputstream(httpurl.getinputstream()); 

   integer lenf=httpurl.getcontentlength();
   //string lenf=this.getfilelength(4189053, 7189053);
   response.setcontenttype("application/x-msdownload"); 
   response.setheader("content-length", lenf.tostring());//文件大小值5幾m
   response.setheader("content-disposition", "attachment; filename="+java.net.urlencoder.encode(name,"utf-8"));
   outputstream out = response.getoutputstream();
   byte[] buf = new byte[1024]; 
   if (desturl != null) { 
    bufferedinputstream br = bis; 
    int len = 0; 
    while ((len = br.read(buf)) > 0){ 
     out.write(buf, 0, len); 
    }     
    br.close(); 
   } 
   out.flush(); 
   out.close(); 
  }

 } 

}

圖片縮放的業務

package com.document.tool;

import java.io.ioexception;

import javax.swing.imageicon;

import org.apache.commons.exec.commandline;
import org.apache.commons.exec.defaultexecuteresulthandler;
import org.apache.commons.exec.defaultexecutor;
import org.apache.commons.exec.executeexception;
import org.apache.commons.exec.executewatchdog;
import org.apache.commons.exec.executor;
import org.slf4j.logger;
import org.slf4j.loggerfactory;

/**
 * 使用imagemagick對圖片文件進行處理的工具類。
 * @author xingning ou
 */
public abstract class imagemagickutils {

 private static final string executable_convert = "/usr/bin/convert"; // convert命令

 private static final string executable_composite = "/usr/bin/composite"; // composite命令

 private static final long execute_timeout = 30 * 60 * 1000l; // 30 minutes

 private static final logger log = loggerfactory.getlogger(imagemagickutils.class);

 /**
  * 執行圖片處理的命令。
  * @param cmdline 待執行的命令
  * @return exitvalue,一般等于0時表示正常運行結束
  * @throws executeexception 命令執行失敗時拋出此異常
  * @throws ioexception 當發生io錯誤時拋出此異常
  * @throws interruptedexception 當等待異步返回結果被中斷時拋出此異常
  */
 public static int executecommandline(commandline cmdline) throws executeexception, ioexception,
 interruptedexception {
  executor executor = new defaultexecutor();
  executor.setexitvalue(0);

  // kill a run-away process after execute_time milliseconds.
  executewatchdog watchdog = new executewatchdog(execute_timeout);
  executor.setwatchdog(watchdog);

  // execute the print job asynchronously.
  defaultexecuteresulthandler resulthandler = new defaultexecuteresulthandler();
  executor.execute(cmdline, resulthandler);

  // some time later the result handler callback was invoked.
  resulthandler.waitfor();

  // so we can safely request the exit value.
  return resulthandler.getexitvalue();
 }

 /**
  * 按照高寬比例縮小圖片。
  * @param src 源圖片
  * @param dst 目標圖片
  * @param width 圖片圖片的寬度
  * @param height 目標圖片的高度
  * @return 是否處理成功
  */
 public static boolean scale(string src, string dst, int width, int height) {
  // 構建命令
  commandline cmdline = new commandline(executable_convert);
  cmdline.addargument(src);
  cmdline.addargument("-scale");
  cmdline.addargument(width + "x" + height);
  cmdline.addargument(dst);

  try {
   executecommandline(cmdline);
   return true;
  } catch (exception e) {
   log.error("縮略圖片時發生異常,cause: ", e);
   return false;
  }
 }

 /**
  * 按照高寬比例縮小圖片。
  * @param src 源圖片
  * @param dst 目標圖片
  * @param width 圖片圖片的寬度
  * @param height 目標圖片的高度
  * @return 是否處理成功
  */
 public static boolean thumbnail(string src, string dst, int width, int height) {
  // 構建命令
  commandline cmdline = new commandline(executable_convert);
  cmdline.addargument(src);
  cmdline.addargument("-thumbnail");
  cmdline.addargument(width + "x" + height);
  cmdline.addargument(dst);

  try {
   executecommandline(cmdline);
   return true;
  } catch (exception e) {
   log.error("縮略圖片時發生異常,cause: ", e);
   return false;
  }
 }

 /**
  * 添加圖片水印。
  * @param src 源圖片
  * @param dst 目標圖片
  * @param logofile 水印圖片
  * @param dissolve 和水印的融合度,0-100的數字
  * @param gravity 疊放方向,east,west,north,south,northeast,northwest,southeast,southwest
  * @return 是否處理成功
  */
 public static boolean drawlogo(string src, string dst, string logofile, int dissolve, string gravity) {
  // 構建命令
  commandline cmdline = new commandline(executable_composite);
  cmdline.addargument("-dissolve");
  cmdline.addargument(dissolve + "%");
  cmdline.addargument("-gravity");
  cmdline.addargument(gravity);
  cmdline.addargument(logofile);
  cmdline.addargument(src);
  cmdline.addargument(dst);

  try {
   executecommandline(cmdline);
   return true;
  } catch (exception e) {
   log.error("添加圖片水印時發生異常,cause: ", e);
   return false;
  }
 }

 /**
  * 添加圖片水印。
  * @param src 源圖片
  * @param dst 目標圖片
  * @param logofile 水印圖片
  * @param dissolve 和水印的融合度,0-100的數字
  * @param x 水印距離左下角的距離
  * @param y 水印距離右下角的距離
  * @return 是否處理成功
  */
 public static boolean drawlogo(string src, string dst, string logofile, int dissolve, int x, int y) {
  imageicon icon = new imageicon(src);
  int width = icon.geticonwidth(); // 源圖的寬
  int height = icon.geticonheight(); // 源圖的高

  string _x = string.valueof(width - x); // 在x軸上水印圖片的左上頂點距離圖片左上角的距離
  string _y = string.valueof(height - y); // 在y軸上水印圖片的左上頂點距離圖片左上角的距離

  // 構建命令
  commandline cmdline = new commandline(executable_composite);
  cmdline.addargument("-dissolve");
  cmdline.addargument(dissolve + "%");
  cmdline.addargument("-geometry");
  cmdline.addargument(_x + "+" + _y);
  cmdline.addargument(logofile);
  cmdline.addargument(src);
  cmdline.addargument(dst);

  try {
   executecommandline(cmdline);
   return true;
  } catch (exception e) {
   log.error("添加圖片水印時發生異常,cause: ", e);
   return false;
  }
 }

 /**
  * 裁剪圖片。
  * @param src 源圖片
  * @param dst 目標圖片
  * @param width 目標寬度
  * @param height 目標高度
  * @param left 裁剪位置:距離左邊的像素
  * @param top 裁剪位置:距離上邊的像素
  * @return 是否處理成功
  */
 public static boolean crop(string src, string dst, int width, int height, int left, int top) {
  // 構建命令
  commandline cmdline = new commandline(executable_convert);
  cmdline.addargument(src);
  cmdline.addargument("-crop");
  cmdline.addargument(width + "x" + height + "+" + left + "+" + top);
  cmdline.addargument(dst);

  try {
   executecommandline(cmdline);
   return true;
  } catch (exception e) {
   log.error("裁剪圖片時發生異常,cause: ", e);
   return false;
  }
 }

 /**
  * 獲取矩形的小圖。
  * @param src 源圖片
  * @param dst 目標圖片
  * @param width 目標寬度
  * @param height 目標高度
  * @param left 裁剪位置:距離左邊的像素
  * @param top 裁剪位置:距離上邊的像素
  * @return 是否處理成功
  */
 public static boolean croprect(string src, string dst, int width, int height, int left, int top) {
  imageicon icon = new imageicon(src);
  int origwidth = icon.geticonwidth();
  int origheight = icon.geticonheight();
  int[] s = new int[2];
  if (origwidth < origheight) { // 以寬為標準
   s = getsize(origwidth, origheight, width, height, 1);
  } else {// 以高為標準
   s = getsize(origwidth, origheight, width, height, 2);
  }

  if (thumbnail(src, dst, s[0], s[1])) {
   return crop(src, dst, width, height, left, top);
  }
  return false;
 }

 /**
  * 加邊框。
  * @param src 源圖片
  * @param dst 目標圖片
  * @param borderwidth 邊框的寬度
  * @param borderheight 邊框的高度
  * @param bordercolor 邊框的顏色
  * @return 是否處理成功
  */
 public static boolean border(string src, string dst, int borderwidth, int borderheight, string bordercolor) {
  // 構建命令
  commandline cmdline = new commandline(executable_convert);
  cmdline.addargument("-bordercolor");
  cmdline.addargument(bordercolor);
  cmdline.addargument("-border");
  cmdline.addargument(borderwidth + "x" + borderheight);
  cmdline.addargument(src);
  cmdline.addargument(dst);

  try {
   executecommandline(cmdline);
   return true;
  } catch (exception e) {
   log.error("加圖片邊框時發生異常,cause: ", e);
   return false;
  }
 }

 /**
  * 轉換圖片格式。
  * @param src 源圖片
  * @param dst 目標圖片
  * @param format 轉換的格式
  * @return 是否處理成功
  */
 public static boolean format(string src, string dst, string format) {
  // 構建命令
  commandline cmdline = new commandline(executable_convert);
  cmdline.addargument(src);
  cmdline.addargument("-format");
  cmdline.addargument("'" + format + "'");
  cmdline.addargument(dst);

  try {
   executecommandline(cmdline);
   return true;
  } catch (exception e) {
   log.error("轉換圖片格式時發生異常,cause: ", e);
   return false;
  }
 }

 /**
  * 轉換無限極的tiff圖片。
  */
 public static boolean converttiff(string src, string dst) {  
  // 構建命令
  commandline cmdline = new commandline(executable_convert);
  cmdline.addargument(src);
  cmdline.addargument("-colorspace");
  cmdline.addargument("rgb");
  cmdline.addargument(dst);

  try {
   executecommandline(cmdline);
   return true;
  } catch (exception e) {
   log.error("轉換圖片格式時發生異常,cause: ", e);
   return false;
  }
 }


 /**
  * 獲得要壓縮圖片的大小。
  * @param w 圖片的原寬度
  * @param h 圖片的原高度
  * @param width 標準寬
  * @param height 標準高
  * @param type 類型 1-以寬為標準壓縮 2-以高為標準壓縮 3-以比例大小壓縮
  * @return size[0]-要壓縮的寬度, size[1]-要壓縮的高度
  */
 public static int[] getsize(double w, double h, double width, double height, int type) {
  if (w < width) {// 如果原寬度比標準寬度小
   width = w;
  }
  if (h < height) {// 如果原高度比標準高度小
   height = h;
  }
  double scale = w / h;
  switch (type) {
   case 1:
    height = width / scale;
    break;
   case 2:
    width = height * scale;
    break;
   case 3:
    if (width / height > scale) {
     width = height * scale;
    } else if ((width / height) < scale) {
     height = width / scale;
    }
    break;
  }
  int[] size = new int[2];
  size[0] = (int) width;
  size[1] = (int) height;
  return size;
 }


 /**
  * 指定寬度。
  * @param src
  * @param width
  * @param dst
  */
 public static boolean resize(string src, int width, string dst) {
  // 構建命令
  commandline cmdline = new commandline(executable_convert);
  cmdline.addargument(src);
  cmdline.addargument("-resize");
  cmdline.addargument(width + "");
  cmdline.addargument(dst);

  try {
   executecommandline(cmdline);
   return true;
  } catch (exception e) {
   log.error("縮略圖片時發生異常,cause: ", e);
   return false;
  }
 }

 /**
  * 指定寬度、高度。
  * @param src
  * @param width
  * @param dst
  */
 public static boolean resizewh(string src,string dst, int width, int height ) {
  // 構建命令
  commandline cmdline = new commandline(executable_convert);
  cmdline.addargument(src);
  cmdline.addargument("-resize");
  cmdline.addargument(width + "x" + height +"!");
  cmdline.addargument(dst);

  try {
   executecommandline(cmdline);
   return true;
  } catch (exception e) {
   log.error("縮略圖片時發生異常,cause: ", e);
   return false;
  }
 }
}

服務器上要安裝imagemagick。

“Nginx代理輸出縮放圖片怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广南县| 铜山县| 阿瓦提县| 聂拉木县| 乌兰县| 钟山县| 交口县| 广德县| 农安县| 修武县| 南昌县| 中卫市| 襄城县| 尉犁县| 安化县| 南宫市| 龙川县| 环江| 辽中县| 错那县| 鄂托克旗| 苍山县| 邓州市| 紫金县| 河源市| 中山市| 寿宁县| 南宁市| 中江县| 崇阳县| 弋阳县| 江西省| 林芝县| 巢湖市| 同江市| 青龙| 台山市| 南通市| 彰武县| 永昌县| 扶绥县|