SpringBoot:ファイルのアップロードとアクセスピットオン(MultiPartFile)

プロジェクト環境がSpringBoot 2.0.4、JDK8.0。CentOS7.0のサーバー環境で、nginxのは、バージョンを忘れてしまいました。


序文


フォームファイルからファイルを受信MultiPartFileを使用し、サーバーがプロジェクトの最も基本的なニーズでアップロードし、プロジェクトは私の以前のSpringMVCに基づいているフレームワークを構築するので、ここで言って、SpringBootを使用する際に遭遇MultiPartFileアップロードピットもSpringBoot主に2つのピットで構成され、見て。

  • ファイルを書き込む際に、ファイルのパスを見つけることができませんtransferTo()メソッドを使用します。

  • nginxのファイル403禁断の問題にアクセスします。


ファイルを書き込む際に、ファイルのパスを見つけることができませんtransferTo()メソッドを使用します


我々は問題を解決する前に、我々は、梱包の方法を見て、エラーログをアップロードします。

    public static final String BASE_PATH = "/test/";

    public static String upload(MultipartFile imageFile) {

        if (imageFile.isEmpty()) {
            return null;
        }
        String filename = imageFile.getOriginalFilename();
        
        String ext= null;
        if(filename.contains(".")){
            ext = filename.substring(filename.lastIndexOf("."));
        }else{
            ext = "";
        }
        
        String uuid =  UUID.randomUUID().toString().replaceAll("-", "");
        String nfileName = uuid + ext;
        String dirPath = DateFormatUtils.format(new Date(), "yyyyMMdd");
        String filepath = BASE_PATH.endsWith("/") ? BASE_PATH+dirPath : BASE_PATH+"/"+dirPath;
        File targetFile = new File(filepath, nfileName);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        } else {
            targetFile.delete();
        }
        try {
            imageFile.transferTo(targetFile);
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        String accessUrl =  "/"+nfileName;
        logger.debug("上传文件成功 URL:" + nfileName);
        return accessUrl;
    }

次のエラー・ログに示されているように。

java.io.IOException: java.io.FileNotFoundException: /test/20181025/be3676dffca94c6dac5e96a1a41dcd97.jpg (Is a directory)
    at org.apache.catalina.core.ApplicationPart.write(ApplicationPart.java:122)
    at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.transferTo(StandardMultipartHttpServletRequest.java:255)
    at com.dong.runline.common.utils.UploadUtils.upload(UploadUtils.java:56)
    at com.dong.runline.controller.TimeLineController.createTimeLineAction(TimeLineController.java:55)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

ここで登場java.io.FileNotFoundExceptionの間違いを、これは私たちが次の位置誤差が発生していたデバッグでブレークポイントでは?引き起こした方法です。

ここで私は地元の環境がテストされており、ローカルパスのこの種を作成した見つかっ使用し、最終画像は、このようなパスを作成することです。

SpringMVC環境とはそのような問題では、それを引き起こしているか最後に、SpringBootでこのような問題を浮上している?多くのオンラインのブログが問題の核心の源を見つけることtransferTo()メソッドを照会することによって書かれました。

@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
    this.part.write(dest.getPath());
}

私たちは、その後、write()メソッドを入力してください。

    @Override
    public void write(String fileName) throws IOException {
        File file = new File(fileName);
        if (!file.isAbsolute()) {
            file = new File(location, fileName);
        }
        try {
            fileItem.write(file);
        } catch (Exception e) {
            throw new IOException(e);
        }
    }

我々がいる場合ていることがわかり、この時!file.isAbsolute()確立つまり、私たちは絶対パスを使用していない、そして、file = new File(location,fileName);オリジナルのパスに基づいて場所を追加します。これが理由です、また、解決するのは非常に簡単です、総オンラインは2つのオプションがあります。

  • 絶対パスを使用します
  • 位置の値を変更

最初のオプションは、私たちは場所の値を変更する方法を見て、私たちはクラスに注入するために豆を、次の起動する必要があり、あまり説明しません。パス私たちの店へのパスを。

    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setLocation(UploadUtils.BASE_PATH);
        return factory.createMultipartConfig();
    }

その後、我々は缶にUploadUtils下のファイルを作成する方法を変更しました。

        String uuid =  UUID.randomUUID().toString().replaceAll("-", "");
        String nfileName = uuid + ext;
        File targetFile = new File(nfileName);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        } else {
            targetFile.delete();
        }


nginxのファイル403禁断の問題にアクセスするとき


実際のアクセスエラーで403いわゆるnginxのエラーが発生しました。現在のユーザーが、この理解をリソースにアクセスする権限がありません、我々は可能な2つのオプションがあります。まず、ファイルアクセス権のレベルを下げる。第二に、ユーザのアクセス権を増加ここでは、一つ一つがどのように達成するかを見てみましょう。

  • ファイルのアクセス許可レベルを削減

ファイルへのアクセスを低減し、我々だけ使用する必要があるのchmodコマンドは、簡単に説明し、ここですることができのchmodコマンドを使用します。

マックを使用するプロセスでは、多くの場合、たとえば、ファイルのパーミッションを変更します。

chmod 777 file

上記設定すると、すべてのユーザーがファイルファイルへのフルアクセスを持っています。

なぜ3の他のその他の権利は、これはファイルの所有者ユーザー、グループグループを表すために3桁の数字です?3桁の数字です。7のその権限レベルの所有者、グループのアクセス許可レベル7、また、7他の権限レベル。

なぜこれが3つのLinuxファイルパーミッションの合計がRを読んでいるので、運転のx、wを書くのですか?それは7である。対応する値は、ユーザがファイルに7の値を持つ4,2,1を。ありますとき、彼はファイルに対するすべての権利を有することを意味する4 + 2 + 1のために、この時間、。

それは言うのchmodコマンドを使用する方法は、次の私たちは、ファイルサーバーの使用することができます。chmod 664ファイルのコマンドをし、ファイルのアクセス許可のレベルを下げる。すべてのユーザーがファイルにアクセスできるように、しかし、質問は、ユーザーの操作を行い一度アップロードし、我々はその後、どのように我々が行うことができますか?私たちはユーザーのアクセス権を改善する必要があり、この時間は、明らかに事実ではないとする、手動でファイルのパーミッションを変更する必要があります。

  • 増加したユーザーのアクセス権

実際nginxののイニシエータを変更され、ここで、ユーザーのアクセス権を改善し、我々は最高権限者を設定することにより開始し、その後、我々は、ファイルへのアクセス権を持つことができます。

まず、私たちは、次の手順は、nginxのを使用する必要が始めた人を見てください。

 ps aux | grep "nginx: worker process" | awk '{print $1}'

ここで私は、次のスクリーンショットに示すように、変更を加えました。

もともとアクセスを設定し、任意のnginxの設定がない場合には、最初のルートは誰もあってはならない、それは、nginxののイニシエータである。以前** LS -lファイルを使用されて**コマンドは、ルートが読み取った、ケースファイルのアクセス権を照会任意の許可なしに、他の書き込み権限は、。したがって、我々は人がすることができ、ルートに開始する必要があります。

nginxの開放位置設定ファイル、{nginxのは}あなたのnginxのインストールパスを表します。

vi {nginx}/conf/nginx.conf

以下に示すように、イニシエータを追加します。

user root

コンフィギュレーション・ファイルを検出し、Ngnixを再起動する準備ができて、sbinディレクトリに戻ります。

cd ../sbin/

設定ファイルの検出精度

./nginx -t

何の問題もなく検出、再起動

./nginx -s reload

この時間は、ファイルへの通常のアクセスすることができます。


エピローグ


このブログは、それがきちんと日常の問題、も収集しません。言うことを何よりも、単に何かをする。ようこそ注意サンパウロドン



オリジナル住所ます。https://www.jianshu.com/p/d8666f2e698f

おすすめ

転載: www.cnblogs.com/jpfss/p/10984123.html