我無法在服務器上執行任何上傳操作。相反,「五個很酷的事情,你可以玩做一」,下面似乎不工作:基本文件上傳失敗
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
爲空?我發現了類似的問題here。但是當我在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}
現在的問題是:是什麼應用程序之間的差異,不同的是,第一個有更多的事實參數...
感謝大家到目前爲止的幫助!
問候, 碧玉
您使用的是什麼版本的Play,以及doFileUpload的代碼是什麼樣的。如果它是公共靜態的,那麼你的代碼將無法工作。 – Codemwnci 2011-04-14 16:47:00
感謝您的回答!我已經編輯了我的帖子,回答了你的答案......它不是一個公共方法,但是它不能解釋'upload'的'null'值,還是這樣做? – Jasper 2011-04-17 19:53:48