【发布时间】:2014-01-14 04:14:51
【问题描述】:
亲爱的社区,你好。
我有一个似乎无法解决的问题。 让我解释一下我想做什么。
我有一个带有选择文件对话框和提交按钮的简单 JSF 站点。 当用户选择一个文件并单击提交按钮时,该文件将被发送到我服务器上的一个 servlet,它保存在本地,并应创建一个指向该文件位置的 db 条目。 听起来很简单吧? 到目前为止,这是我的解决方案:
JavaScript:
function postUploadedFile() {
var servlet = "UploadImageToServer";
var inputElement = document.getElementById('filedataDecoded');
var fileTypeElement = document.getElementById('filedataType');
var encodedFile = inputElement.textContent;
var fileType = fileTypeElement.textContent;
inputElement.textContent = "";
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "http://localhost:8080/TestJSF/" + servlet + "?fileType="+fileType , true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.onreadystatechange = function () {
if ((xmlhttp.readyState == 4)) {
// handle callback
console.log("done");
}
}
xmlhttp.send(encodedFile);
console.log();
}
我的 Servlet:
public class UploadImageToServer extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(UploadImageToServer.class);
private String dbUser = "xxxx";
private String dbPw = "xxxx";
public UploadImageToServer() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PreparedStatement stm = null;
Connection con = null;
InputStream fileDataStream = request.getInputStream();
int fileContentLength = request.getContentLength();
String fileType = (request.getParameter("fileType")).split("\\.")[1];
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] fileDataBytes64 = new byte[fileContentLength];
byte[] bufferTemp = new byte[1024];
int nRead;
while ((nRead = fileDataStream.read(bufferTemp, 0, bufferTemp.length)) != -1) {
buffer.write(bufferTemp, 0, nRead);
}
buffer.flush();
String tempString = buffer.toString();
String base64String = tempString.split("base64,")[1];
System.out.println("test");
Double newRandom = (double) -1;
while(newRandom < 5000 || newRandom > 1000000) {
newRandom = Math.random() * 10000;
}
String valueOf = String.valueOf((newRandom));
String fileName = (valueOf.split("\\."))[0] + "." + fileType;
File tempFile = new File("C:\\storage\\" + fileName);
byte[] fileDataDecoded = Base64.decodeBase64(base64String);
tempFile.getParentFile().mkdir();
tempFile.createNewFile();
FileOutputStream foS = new FileOutputStream(tempFile);
foS.write(fileDataDecoded);
foS.close();
String driver = PossibleDbDriver.MYSQL.getIdentifier();
try {
Class.forName(driver);
} catch (ClassNotFoundException e2) {
logger.error("Error - no valid Driver-Class specified - [" + driver + "]");
logger.error("Message - [" + e2.getMessage() + "]");
}
String dbURL = "jdbc:mysql://localhost:3306/imagetest";
try {
con = (Connection) DriverManager.getConnection(dbURL,dbUser,dbPw);
stm = con.prepareStatement("INSERT INTO images (image_name,image_path,image_likes,image_dislikes,image_timestamp) VALUES(?,?,?,?,?)");
stm.setString(1, tempFile.getName());
stm.setString(2, tempFile.getPath());
stm.setDouble(3, 0);
stm.setDouble(4, 0);
stm.setTimestamp(5, new Timestamp(GregorianCalendar.getInstance().getTimeInMillis()));
stm.execute();
} catch (SQLException e) {
logger.error("Error - Connection could not be established.");
logger.error("Message - [" + e.getMessage() + "]");
}
}
}
Servlet 映射:
<servlet>
<description></description>
<display-name>UploadImageToServer</display-name>
<servlet-name>UploadImageToServer</servlet-name>
<servlet-class>mk.imageboard.servlets.UploadImageToServer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadImageToServer</servlet-name>
<url-pattern>/UploadImageToServer</url-pattern>
</servlet-mapping>
文件数据来自另一个脚本,该脚本将其读取为 Base64-String 并将其写入 TextArea-Element 'filedataDecoded'(只是为了澄清这一点)。 应用服务器是 Tomcat 6.0.36,JSF 实现是 MyFaces 2.1.13。 一切都在同一台机器(我的电脑)上运行。
现在我的实际问题... 当我让 Tomcat 在正常模式下运行并访问我的站点并尝试上传文件时,XmlHttpRequest 不会发送。但是,当我在 Chrome 中打开 JavaScript 控制台并设置断点时:
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "http://localhost:8080/TestJSF/" + servlet + "?fileType="+fileType , true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.onreadystatechange = function () {
if ((xmlhttp.readyState == 4)) {
// handle callback
console.log("done");
}
}
xmlhttp.send(encodedFile);
并单步执行脚本,发送请求并且 servlet 工作正常。 我在stackoverflow中搜索了一个解决方案,但找不到任何解决方案。与互联网相同。这是一个奇怪的错误,我不明白为什么它不起作用。 如果有人可以帮助我,我将不胜感激。
提前致谢
克里斯
【问题讨论】:
-
您尝试过其他浏览器吗?
-
是的。我也试过火狐。同样的问题。在设置了断点的调试控制台中它可以工作,没有和没有控制台它都不会。 (我忽略了 IE)
-
那么,事情很严重!
-
我想知道读取文件是否存在某种异步方面?尝试将
postUploadedFile方法的主体包装在 try-catch 块中,然后将生成的错误对象记录到console.error(...) -
我将我的代码包含在一个 try-catch 块中,但没有引发错误。我还在 console.log(error) 行设置了一个断点,但它没有被调用。我认为读取文件没有问题。当我按下提交按钮时,数据就出现了。通过填充文本区域元素的另一个按钮读取数据。所以
postUploadFileonly 访问所有已经存在的数据。
标签: java javascript jsf tomcat servlets