file-upload
で(一般的な fileuplod) を使用しましたstrtus-2.3.15.3
。私の中には、明白な.jsp
を含む多くの差分タイプ(テキストフィールド、テキストエリア、非表示、ファイル)を持つ複数のフィールドを持つ1つのフォームがあります。FILE
SUBMIT
1つのファイルを選択してフォームを送信し、他のすべてのフィールドにテキストを入力すると、生成され.tmp
たファイルが一時フォルダーに記載されます。.tmp
ファイルを myfolder にアップロードした後、ファイル フィールドに関連するファイルのみが削除されますが、残りの.tmp
(1kb サイズの) ファイルはそのまま残ります。
List items = upload.parseRequest(servletRequest);
以下のコードのこの行は、.tmp
何らかの値を持つすべてのフィールドのファイルを生成します (テキスト フィールドにテキストを入力しないと生成されません)。
MonitoredMultiPartRequest.java
:
public void parse(HttpServletRequest servletRequest, String saveDir)
throws IOException
{
System.setProperty("java.io.tmpdir", "D:\\ankit");
UploadListener listener = new UploadListener(servletRequest);
// Create a factory for disk-based file items
FileItemFactory factory = new MonitoredDiskFileItemFactory(listener);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
}
MonitoredDiskFileItemFactory
:
public class MonitoredDiskFileItemFactory extends DiskFileItemFactory
{
HttpServletRequest request;
public MonitoredDiskFileItemFactory(OutputStreamListener listener, HttpServletRequest request)
{
this.listener = null;
this.listener = listener;
this.request = request;
setTrackers();
}
public void setTrackers()
{
FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(request.getServletContext());
File repository = new File(System.getProperty("java.io.tmpdir"));
DiskFileItemFactory factory = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, repository);
factory.setFileCleaningTracker(fileCleaningTracker);
super.setFileCleaningTracker(fileCleaningTracker);
super.setRepository(repository);
}
public MonitoredDiskFileItemFactory(int sizeThreshold, File repository, OutputStreamListener listener)
{
super(sizeThreshold, repository);
this.listener = null;
this.listener = listener;
}
public FileItem createItem(String fieldName, String contentType, boolean isFormField, String fileName)
{
MonitoredDiskFileItem result = new MonitoredDiskFileItem(fieldName, contentType, isFormField, fileName, getSizeThreshold(), getRepository(), listener);
FileCleaningTracker tracker = getFileCleaningTracker();
if (tracker != null)
{
tracker.track(result.getTempFileOfDistFileItem(), result);
}
return result;
}
private OutputStreamListener listener;
}
MonitoredDiskFileItem
:
public class MonitoredDiskFileItem extends DiskFileItem
{
public MonitoredDiskFileItem(String fieldName, String contentType, boolean isFormField, String fileName, int sizeThreshold, File repository, OutputStreamListener listener)
{
super(fieldName, contentType, isFormField, fileName, sizeThreshold, repository);
mos = null;
this.listener = listener;
}
public OutputStream getOutputStream()
throws IOException
{
if (mos == null)
mos = new MonitoredOutputStream(super.getOutputStream(), listener);
return mos;
}
public File getTempFileOfDistFileItem()
{
return super.getTempFile();
}
private MonitoredOutputStream mos;
private OutputStreamListener listener;
}
UploadListener
:
public class UploadListener implements OutputStreamListener, Serializable
{
private static final long serialVersionUID = 1L;
private int totalToRead = 0;
private int totalBytesRead = 0;
private int percentDone = 0;
private int previou_percentDone = 0;
private long uploadspeed = 0;
private long starttime;
private long stTime, EndTime;
HttpSession session;
private int count = 0;
public UploadListener(HttpServletRequest request)
{
totalToRead = request.getContentLength();
session = request.getSession();
}
public void start()
{
session.setAttribute("percentageDone", 0);
session.setAttribute("speed", 0);
starttime = System.currentTimeMillis();
stTime = starttime;
}
public String getMessage()
{
return "" + totalBytesRead + " bytes have been read (" + percentDone + "% done) ";
}
public void bytesRead(int bytesRead)
{
totalBytesRead = totalBytesRead + bytesRead;
if (100.00 * totalBytesRead > totalToRead)
{
previou_percentDone = percentDone;
percentDone = (int) Math.round(100.00 * totalBytesRead / totalToRead);
if (previou_percentDone < percentDone)
{
long speed = 0;
try
{
double TimediffInSecond = (System.currentTimeMillis() - starttime) / 1000;
if (TimediffInSecond > 0)
speed = Math.round(((totalBytesRead) / TimediffInSecond) / 1048576);
else
speed = totalBytesRead / 1048576;
}
catch (Exception e)
{
System.err.println(e.getMessage());
}
}
}
}
public void done()
{
EndTime = System.currentTimeMillis();
session.setAttribute("percentageDone", 100);
session.setAttribute("speed", 100);
}
@Override
public void error(String message)
{
// System.out.println(message);
}
public long getUploadspeed()
{
return uploadspeed;
}
public void setUploadspeed(long uploadspeed)
{
this.uploadspeed = uploadspeed;
}
}
EDIT
:
1> この.tmp
ファイルがフィールド (textarea、hidden、textfield) 用に生成される理由。どうすればこれを防ぐことができますか?
2> where (ファイル フィールド).tmp
以外のすべてのフィールドのファイルの生成を停止したい。type='file'
.tmp
3>そうでなければ、どうすればこのすべてのファイルを削除できますか?