Heim  >  Fragen und Antworten  >  Hauptteil

Problem mit Nginx bei der Verarbeitung des tatsächlichen Pfads von Bildern

Im Projekt werden die hochgeladenen Dateien von sha1 umbenannt. Nachdem ein Bild hochgeladen wurde, heißt es c2e47454e951697811c0531949d4d318. Der Zugriffspfad auf der Browserseite lautet: /img/c2e47454e951697811c0531949d4d318 für das Bild!

Nach der Bereitstellung muss ich Nginx für die Caching-Verarbeitung verwenden. Also lasst mich euch fragen, wie ich damit umgehen soll:

怎么在nignx里配置映射到真实的 image_save_path/img/c2/e4/7454e951697811c0531949d4d318.[jpg|gif|png]

location ~/img/*$ {
    root image_real_path_here;
    # 此处不太理解该如何处理图片名称的前四个字符,变成路径形式,        
}

Bitte hilf mir sehr! Danke

怪我咯怪我咯2713 Tage vor467

Antworte allen(1)Ich werde antworten

  • 仅有的幸福

    仅有的幸福2017-05-16 17:23:57

    首先,你既然已经将其sha1过了,就不需要再存储其后缀名了,存储时将所有都改变为sha1后的值

    然后,如果直接访问Nginx来获取图片的话是得不到正确的文件名的,有些其他的逻辑也不好处理,所以干脆写一个controller来做处理:

        @RequestMapping(value = "imgs/{sha1}/download", method = RequestMethod.GET)
        @ResponseBody
        public HttpEntity<byte[]> downloadAttachment(@PathVariable("sha1") String sha1)
                throws UnsupportedEncodingException {
            Attachment attachment = attachmentService.getBySha1(sha1);
    
            if (attachment == null) {
                throw new ResourceNotFoundException();
            }
    
            HttpHeaders header = new HttpHeaders();
            header.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            String filename = new String(attachment.getName().getBytes("GB2312"), "ISO_8859_1");
            header.setContentDispositionFormData("attachment", filename);
            header.add("X-Accel-Redirect", String.format("/img/c2/e4/%s", sha1));
            header.add("X-Accel-Charset", "utf-8");
    
            return new HttpEntity<byte[]>(null, header);
        }

    这样既可以使用Nginx的缓存,又可以使用自己的代码做一些逻辑操作,还可以添加权限判断的功能

    另外Nginx的配置不需要改变

    Antwort
    0
  • StornierenAntwort