#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. такая классика. так неудачно, потому что полезный внутренний браузер на самом деле был бы отличной вещью 🙂