Я не могу выполнять какие-либо операции загрузки на сервер.Вопреки «одной из пяти классных вещей, которые вы можете сделать с помощью игры», следующее не работает:
public static void doSingleFileUpload(
Long id, @Required java.io.File upload, String description, String title
) {
Score score = Score.findById(id);
try {
score.files.add(new File(doFileUpload(new FileInputStream(upload), score), title));//PLAY crashes here, with a nullpointer exception on the upload parameter
} catch (IOException ex) {
//TODO: do something nice
}
score.save();
}
doFileUpload
выглядит так:
@Check("registered")
private static String doFileUpload(InputStream is, Score score) throws IOException {
//get Score from db
//get dir if present
java.io.File dir = new java.io.File("/public/uploads/" + play.templates.JavaExtensions.slugify(score.title));
//if not, create
if (!dir.exists()) {
dir.mkdirs(); //create new dir if not present
}
//create file on server
java.io.File newfile = new java.io.File(dir, "testfile.txt");
OutputStream os = new FileOutputStream(newfile);
IOUtils.copy(is, os);
return newfile.getAbsolutePath();
}
Сэто представление:
<!-- ... -->
<form action="@{ScoreController.doSingleFileUpload()}" method="POST" enctype="multipart/form-data">
<input type="hidden" name="id" value="${score.id}" />
<input type="file" id="upload" name="upload" />
<input type="text" name="description" />
<input type="hidden" name="title" value="${score.title}" />
<input type="submit" value="submit" />
</form>
Почему upload
равно нулю?Я нашел похожую проблему здесь .Но когда я смотрю на заголовки после POST, там очень мало информации, кроме ключа playsession ...
Что я делаю не так?
Я тестирую с FF4 ииспользование Play 1.1.1.
РЕДАКТИРОВАТЬ: этот пример приложения работает как в 1.1.1 и 1.2.
Контроллер:
public class Application extends Controller {
public static void index() {
File dir = new File(Play.applicationPath+File.separator+"public"+File.separator+"uploads");
if (!dir.exists() && dir.isDirectory()) {
renderText("something went wrong");
} else {
String[] files = dir.list();
if (files != null) {
render(dir);
} else {
render();
}
}
}
public static void upload(File upload) throws FileNotFoundException, IOException {
File dir = new File(Play.applicationPath+File.separator+"public"+File.separator+"uploads");
if (!dir.exists()) {
dir.mkdirs();
}
File newfile = new File(dir, upload.getName());
FileInputStream fis = new FileInputStream(upload);
FileOutputStream fos = new FileOutputStream(newfile);
IOUtils.copy(fis, fos);
index();
}
}
Просмотр:
#{extends 'main.html' /}
#{set title:'Home' /}
#{form @Application.upload(), enctype:'multipart/form-data'}
<input type="file" name="upload" />
<input type="submit" />
#{/form}
#{if (dir.list()!=null)}
<ul>
#{list items:dir.list(), as:'file'}
<li><a href="public/uploads/${file}">${file}</a></li>
#{/list}
</ul>
#{/if}
Теперь возникает вопрос: в чем разница между приложениями, за исключением того, что у первого есть больше параметров ...
Спасибо запомогите всем до сих пор!
привет, яшма