我正在使用gwt小部件gwtupload.client.Uploader,我正在尝试使用fileupload流式api将文件保存到数据库中的blob列中。 问题是,如果文件大于3k,则只能节省3k(3.25K)。 谢谢您的帮助。 这是代码:
try {
ServletFileUpload upload = new ServletFileUpload();
upload.setProgressListener(listener);
FileItemIterator iter = upload.getItemIterator(request);
InputStream stream = null;
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
stream = item.openStream();
Object o = getThreadLocalRequest().getSession().getAttribute(PortailServiceIMPL.FICHIER_SESSION_STORE_KEY);
if (o != null && o instanceof Fichier) {
uploadService.sauvegarder((Fichier) o, stream);
listener.update(listener.getContentLength(),
listener.getContentLength(), 0);
} else {
throw new RuntimeException(
"Impossible de recuperer le fichier de la session.");
}
}
if (stream != null) {
stream.close();
}
} catch (SizeLimitExceededException e) {
RuntimeException ex = new UploadSizeLimitException(
e.getPermittedSize(), e.getActualSize());
listener.setException(ex);
throw ex;
} catch (UploadSizeLimitException e) {
listener.setException(e);
throw e;
} catch (UploadCanceledException e) {
listener.setException(e);
throw e;
} catch (UploadTimeoutException e) {
listener.setException(e);
throw e;
} catch (Exception e) {
logger.error("UPLOAD-SERVLET (" + request.getSession().getId()
+ ") Unexpected Exception -> " + e.getMessage() + "\n"
+ stackTraceToString(e));
e.printStackTrace();
RuntimeException ex = new UploadException(e);
listener.setException(ex);
throw ex;
}
保存文件的lina是:
uploadService.sauvegarder((Fichier) o, stream);
之后有4个方法,直到达到保存InputStream的代码(未触及InputStream):
public void storeBlob(long id, InputStream pInputStream) throws Exception {
try {
java.sql.Connection conn = //get the connection;
PreparedStatement ps = conn.prepareStatement(SQL_STORE);
ps.setBinaryStream(1, pInputStream, pInputStream.available());
ps.setLong(2, id);
ps.executeUpdate();
ps.close();
em.getTransaction().commit();
} catch (Throwable t) {
em.getTransaction().rollback();
throw new Exception(t);
}
}
如果我使用FileItemFactory它可以工作,但那不是我想要的:
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> uploadedItems = upload.parseRequest(request);
for (FileItem item : uploadedItems) {
InputStream stream = item.getInputStream();
感谢您的帮助。
答案 0 :(得分:0)
经过一些努力,我解决了它。
在storeBlob方法中我无法使用pInputStream.available()。所以,这就是我使用的那条线:
ps.setBinaryStream(1, pInputStream);