web-dev-qa-db-ja.com

Spring MVCはアップロードされたMultipartFileを特定のフォルダーに保存します

TomcatにデプロイされたSpring 3 MVCアプリケーションの特定のフォルダーにアップロードされた画像を保存したい

私の問題は、アップロードされた画像ファイルを、アプリケーションが実行されているホストに保存できないことです。

ここに私が試したものがあります:

_private void saveFile(MultipartFile multipartFile, int id) throws Exception {
    String destination = "/images/" + id + "/"  + multipartFile.getOriginalFilename();
    File file = new File(destination);
    multipartFile.transferTo(file);
}
_

結果:FileNotFoundException-はい、確かに、このファイルを作成します!?!

_context.getRealPath_またはgetResources("destination")を使用して試しましたが、成功しませんでした。

マルチパートファイルのコンテンツを使用して、アプリの特定のフォルダーに新しいファイルを作成するにはどうすればよいですか?

30
Alexander

このコードはきっと役立ちます。

String filePath = request.getServletContext().getRealPath("/"); 
multipartFile.transferTo(new File(filePath));
31
Ravi Maroju

Webappにuploadsディレクトリを作成し、webapp/uploadsにファイルを保存しましょう:

_@RestController
public class GreetingController {

    private final static Logger log = LoggerFactory.getLogger(GreetingController.class);

    @Autowired
    private HttpServletRequest request;


    @RequestMapping(value = "/uploadfile", method = RequestMethod.POST)
        public
        @ResponseBody
        ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file) {
            if (!file.isEmpty()) {
                try {
                    String uploadsDir = "/uploads/";
                    String realPathtoUploads =  request.getServletContext().getRealPath(uploadsDir);
                    if(! new File(realPathtoUploads).exists())
                    {
                        new File(realPathtoUploads).mkdir();
                    }

                    log.info("realPathtoUploads = {}", realPathtoUploads);


                    String orgName = file.getOriginalFilename();
                    String filePath = realPathtoUploads + orgName;
                    File dest = new File(filePath);
                    file.transferTo(dest);
_

コード
String realPathtoUploads = request.getServletContext().getRealPath(uploadsDir);

idea IDEからアプリを実行すると、次のパスが返されます
_C:\Users\Iuliia\IdeaProjects\ENumbersBackend\src\main\webapp\uploads\_

.warを作成してTomcatで実行する場合の次のパス:
_D:\Programs_Files\Apache-Tomcat-8.0.27\webapps\enumbservice-0.2.0\uploads\_

私のプロジェクト構造:
enter image description here

12
Yuliia Ashomok

Xml構成を使用したspring 3の例を見ました(これはspring 4.2。*ではうまくいきません): http://www.devmanuals.com/tutorials/Java/spring/spring3/mvc/spring3-mvc- upload-file.html `

<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000" />
<property name="uploadTempDir" ref="uploadDirResource" />
</bean>

<bean id="uploadDirResource" class="org.springframework.core.io.FileSystemResource">
<constructor-arg>
<value>C:/test111</value>
</constructor-arg>
</bean>
1

以下はubuntuで私のために働いた:

String filePath = request.getServletContext().getRealPath("/");
File f1 = new File(filePath+"/"+multipartFile.getOriginalFilename());
multipartFile.transferTo(f1);
0
Vijay
String ApplicationPath = 
        ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("");

これは、Springでアプリの実際のパスを取得する方法です(応答、セッションを使用せずに...)

0
Laster Liang

InputpartStreamをmultipartfileから取得して、必要な任意のディレクトリにコピーできます。

public String write(MultipartFile file, String fileType) throws IOException {
    String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss-"));
    String fileName = date + file.getOriginalFilename();

    // folderPath here is /sismed/temp/exames
    String folderPath = SismedConstants.TEMP_DIR + fileType;
    String filePath = folderPath + "/" + fileName;

    // Copies Spring's multipartfile inputStream to /sismed/temp/exames (absolute path)
    Files.copy(file.getInputStream(), Paths.get(filePath), StandardCopyOption.REPLACE_EXISTING);
    return filePath;
}

これは、LinuxとWindowsの両方で機能します。