Добрый день!
На сервере Tomcat 6 и Db2.
При загрузке файлов на сервер, несколькими пользователями одновременно, происходит путаница: файл который один пользователь загружает в БД, может загрузиться на место файла, который в это время грузит другой пользователь. Ниже приведён сервлет, который занимается загрузкой файлов. Скажите, где я допустил ошибку. До сих пор я решал проблему тем, что перед doPost(... писал synchronized, но дальше так нельзя, количество пользователей растёт и ждать при загрузке файлов им приходиться всё дольше
import java.io.*;
import java.sql.*;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.*;
import Tables.Conn;
public class upload4 extends HttpServlet {//Сервлет для загрузки документов
public String FNAME = "_1";
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
FileItemFactory factory= new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
String fileName = null;//имя файла на клиентской машине
FileItem actualFile = null;//файл
PrintWriter out = response.getWriter();
try {
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {//если текущий элемент не файл
String name = item.getFieldName();//имя параметра
String value = item.getString();//значение параметра
if (name.equals("fname1"))//файл записывается в таблицу БД,
//в запись где ключевое поле=fname1
{ FNAME = value; }
} else //если текущий элемент файл
{
fileName = item.getName();//имя файла
actualFile = item;//тело файла
}
}
if (fileName != null && fileName.length() > 0 && actualFile != null)
{
String docType="";//расширение файла
fileName=fileName.toLowerCase();
if (fileName.substring(fileName.length()-3, fileName.length()).equals("jvu"))
{docType="djvu";
}else if (fileName.substring(fileName.length()-3, fileName.length()).equals("txt"))
{docType="txt";
}else if (fileName.substring(fileName.length()-3, fileName.length()).equals("rtf"))
{docType="rtf";
}else if(fileName.substring(fileName.length()-3, fileName.length()).equals("doc"))
{docType="doc";}
try{Connection con = Conn.getConnectionWS();
try{
int fileSize = (int) actualFile.getSize();//размер файла
java.io.InputStream fin = actualFile.getInputStream();
java.sql.PreparedStatement pstmt = con.prepareStatement(
"UPDATE DOCTEL SET DOCT = ?, DOCTYPE='"+docType+"' WHERE IDDOC="+FNAME);
pstmt.setBinaryStream(1, fin, fileSize);
pstmt.executeUpdate();
fin.close();
out.println(
"<%@page contentType='text/html; charset=windows-1251' %>");
out.println("<html><head><meta http-equiv='Content-Language' content='ru'><meta http-equiv='Content-Type' content='text/html; charset=windows-1251'><title>Upload1</title></head><body bgcolor='#FFFFCC'>");
String sss = "Файл загружен в базу данных ";
sss = new String(sss.getBytes("Cp1251"), "ISO-8859-1");
out.println("<p>" + sss + "</p>");
sss = "Закрыть";
sss = new String(sss.getBytes("Cp1251"), "ISO-8859-1");
out.println("<a href='addDoc.jsp?link=selectObr.jsp'>"+
sss + "</a>");
out.println("</body></html>");
}catch(Exception e){}finally{con.close();}
}catch(Exception e){}
} else {}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Файлы путаются при загрузке на сервер
Модератор: Absurd
Насколько я понимаю в Яве и сервлетах для решения проблемы достаточно занести переменную FNAME внутрь doPost
остальные создаются при каждом входе в doPost эта при создании экземпляра класса
остальные создаются при каждом входе в doPost эта при создании экземпляра класса
Очень большое спасибо! Дело было именно в этом.