Jersey multipart GetFileName() имеет объединенный путь

#java #jersey

#java #джерси

Вопрос:

Я пытаюсь загрузить файл, работающий с Java Jersey multipart Tomcat HTML / CSS / JS.

В целях тестирования я просто пытаюсь загрузить некоторый произвольный файл из моей папки Downloads и записать его на свой рабочий стол.

Похоже, моя единственная проблема заключается в том, что когда я пытаюсь каким-то образом получить имя файла загруженного файла fileDetail.getFileName(); , я получаю объединенный путь с именем файла («C:UsersHackRDownloadsstackexample.csv «).

Мой план (следуя руководству) состоял в том, чтобы затем добавить каталог назначения к имени файла:

     String uploadedFileLocation = "C:/Users/HackR/Desktop/"
              fileDetail.getFileName();
 

и запишите его. Однако в конечном итоге он пытается записать его в нечто подобное:

 C:/Users/HackR/Desktop/C:UsersHackRDownloadsstackexample.csv
 

который на самом деле просто создает файл размером 0 КБ с именем C на моем рабочем столе.

Как я могу получить фактическое имя файла так, как оно мне нужно для этого примера (т. Е. Без пути)?

Это вся моя служба загрузки файлов:

 package com.mkyong.rest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;

@Path("/file")
public class UploadFileService {

    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
            @FormDataParam("file") InputStream uploadedInputStream,
            @FormDataParam("file") FormDataContentDisposition fileDetail) {

        String uploadedFileLocation = "C:/Users/HackR/Desktop/"
                  fileDetail.getFileName();

        // save it
        writeToFile(uploadedInputStream, uploadedFileLocation);

        String output = "File uploaded to : "   uploadedFileLocation;

        return Response.status(200).entity(output).build();

    }

    // save uploaded file to new location
    private void writeToFile(InputStream uploadedInputStream,
            String uploadedFileLocation) {

        try {
            OutputStream out = new FileOutputStream(new File(
                    uploadedFileLocation));
            int read = 0;
            byte[] bytes = new byte[1024];

            out = new FileOutputStream(new File(uploadedFileLocation));
            while ((read = uploadedInputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            out.flush();
            out.close();
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

}
 

Комментарии:

1. Не могли бы вы указать, на какой именно платформе вы находитесь? Windows 10? Потому что это облегчит поиск источника вашей проблемы, которая, я полагаю, возникает в движке браузера вашей системы, который используется eclipse 🙂

2. @yeoman Да, это Windows 10, спасибо.

Ответ №1:

Объединенное имя файла является результатом использования браузера, встроенного в Eclipse, Который может неправильно поддерживать ваш HTML, CSS, JS и т. Д., Особенно если вы используете Angular JS или любые технологии webkit, даже косвенно.

Внутренний браузер eclipse на самом деле является просто встроенным элементом управления браузером 🙂 На Mac это заставляет его использовать Safari, движком которого является webkit.

Сделайте свою работу с Safari или, может быть, с Chrome, который все еще очень похож, потому что он основан на относительно недавнем форке webkit, тогда он должен работать и во внутреннем браузере eclipse на Mac 🙂

Поскольку ваш пост предполагает, что вы находитесь на компьютере с Windows, вам нужно вместо этого заставить свой код работать с установленным Internet Explorer, потому что это то, что eclipse использует в Windows.

Удачи в любом случае!

Комментарии:

1. Спасибо. Я полагаю, что ваш ответ относится к оригинальному названию моего вопроса. Я прошу прощения за это. Этот заголовок был взят из неопубликованного вопроса, который я написал вчера, и он не соответствовал этому вопросу. Я исправил заголовок. Опять же, мои извинения за путаницу.

2. Ах, намного лучше! 😀

3. Итак, я не думал, что это имеет какое-то отношение к webkit или браузеру, но, оказывается, вы правы — это так. Эта проблема возникает только с глупым внутренним браузером. Этого не происходит с Chrome. Я удивлен, потому что я просто использую обычный HTML на странице загрузки файла, за исключением того, что я использовал CSS для оформления кнопки загрузки и использую Angular JS для отображения ошибок. О, я думаю, потому что в моем файле styles.css есть несколько CSS-инструкций webkit-filter, которые должны каким-то образом испортить внутренний браузер Eclipse (Internet Explorer).

4. такая классика. так неудачно, потому что полезный внутренний браузер на самом деле был бы отличной вещью 🙂