D
Dundonald
I'm hoping some in here will have had experience with the Jakarta
commons
file upload utility and inparticular writing an uploaded file to a BLOB
field.
I configure file upload as follows:
DiskFileUpload upload = new DiskFileUpload();
upload.setSizeMax(-1);
upload.setSizeThreshold(4096);
upload.setRepositoryPath("c:/temp");
Any file greater than 4096 bytes will be temporarily stored in to
c:/temp
whilst the FileItem object from an uploaded file exists. This can be
verified by using the isInMemory() method on FileItem. It returns
false if
a temporary file is stored.
I do see files created in c:/temp and the temporary file is the full
and
correct file size. So let's say for example I upload an image at 400k
I do
see a .tmp file in c:/temp at 400k and if I rename the .tmp file to
..jpg
and open it up it is displayed correctly.
However, when I retrieve the file that was written to a Blob field in
MySQL, and this can be any file, it is always a maximum of 65,535 bytes
(or
there abouts). When I open this retrieved file, using the image as an
example, only a portion of the jpg is displayed (65,535 bytes worth).
I was wondering if there was anything significant about this and more
importantly how to overcome this problem.
Any file I upload greater than 65,535 bytes has a problem. Any file
less
than this in size works fine.
I've isolated the problem to the write to database rather than the
retrieve
because I checked the database size before and after a test uploading a
400k file. The database grew by only 65,535 (ish) bytes.
I can post the code I wrote to write a FileItem to a MySQL BLOB field
if it
helps but I first wanted to test the water to see if this is a known
problem. I did google but there was no history of this problem in the
archive. In fact I'll post it anyway at the foot of this post.
Fingers crossed.
*** CODE TO WRITE A FileItem TO BLOB FIELD ****
* Note for background a record has already been created and this code
* uses the inserted record ID to update the Blob field of that record.
* A FileItem object called file is passed in to the method.
***
String sql = "";
try
{
/*
* Updated attached document record with file into
blob
field.
*/
sql = "update "+<table name>+" "+
"set "+<blob field name>+"=? "+
"where "+<record id field
name>+"='"+lastInsertedID+"'";
Connection connection = getDatabaseConnection();
PreparedStatement preparedStatement =
connection.prepareStatement(sql);
/* paramater 1, because there is only 1 ? above. */
preparedStatement.setBinaryStream(1,
file.getInputStream(), (int)file.getSize());
preparedStatement.execute();
preparedStatement.close();
}
catch (SQLException e)
{
DatabaseQueryException dbqe = new
DatabaseQueryException(CLASS_NAME, "insertAttachedDocument", sql + " "
,
e.getMessage());
throw dbqe;
}
commons
file upload utility and inparticular writing an uploaded file to a BLOB
field.
I configure file upload as follows:
DiskFileUpload upload = new DiskFileUpload();
upload.setSizeMax(-1);
upload.setSizeThreshold(4096);
upload.setRepositoryPath("c:/temp");
Any file greater than 4096 bytes will be temporarily stored in to
c:/temp
whilst the FileItem object from an uploaded file exists. This can be
verified by using the isInMemory() method on FileItem. It returns
false if
a temporary file is stored.
I do see files created in c:/temp and the temporary file is the full
and
correct file size. So let's say for example I upload an image at 400k
I do
see a .tmp file in c:/temp at 400k and if I rename the .tmp file to
..jpg
and open it up it is displayed correctly.
However, when I retrieve the file that was written to a Blob field in
MySQL, and this can be any file, it is always a maximum of 65,535 bytes
(or
there abouts). When I open this retrieved file, using the image as an
example, only a portion of the jpg is displayed (65,535 bytes worth).
I was wondering if there was anything significant about this and more
importantly how to overcome this problem.
Any file I upload greater than 65,535 bytes has a problem. Any file
less
than this in size works fine.
I've isolated the problem to the write to database rather than the
retrieve
because I checked the database size before and after a test uploading a
400k file. The database grew by only 65,535 (ish) bytes.
I can post the code I wrote to write a FileItem to a MySQL BLOB field
if it
helps but I first wanted to test the water to see if this is a known
problem. I did google but there was no history of this problem in the
archive. In fact I'll post it anyway at the foot of this post.
Fingers crossed.
*** CODE TO WRITE A FileItem TO BLOB FIELD ****
* Note for background a record has already been created and this code
* uses the inserted record ID to update the Blob field of that record.
* A FileItem object called file is passed in to the method.
***
String sql = "";
try
{
/*
* Updated attached document record with file into
blob
field.
*/
sql = "update "+<table name>+" "+
"set "+<blob field name>+"=? "+
"where "+<record id field
name>+"='"+lastInsertedID+"'";
Connection connection = getDatabaseConnection();
PreparedStatement preparedStatement =
connection.prepareStatement(sql);
/* paramater 1, because there is only 1 ? above. */
preparedStatement.setBinaryStream(1,
file.getInputStream(), (int)file.getSize());
preparedStatement.execute();
preparedStatement.close();
}
catch (SQLException e)
{
DatabaseQueryException dbqe = new
DatabaseQueryException(CLASS_NAME, "insertAttachedDocument", sql + " "
,
e.getMessage());
throw dbqe;
}