Я создал сервлет для загрузки файлов с файлового сервера java. Вот некоторая проблема, когда мы работаем с Inte rnet менеджером загрузки и другими инструментами менеджера dl. когда я отключаю принимать заголовок диапазона все работает нормально. Когда я добавляю заголовок диапазона принятия, инструменты менеджера dl начинают загрузку как многопоточную, и на некоторое время все в порядке, и вдруг IDM получает ошибку, и загрузка начинается с самого начала. вот мой код:
import commons.Commons;
import commons.Log;
import commons.Util;
import db.dao.PublicShareDao;
import entity.*;
import enums.MimeType;
import io.OSWorker;
import io.milton.common.FileUtils;
import io.milton.common.StreamUtils;
import io.milton.http.Range;
import org.apache.http.HttpHeaders;
import org.apache.poi.util.IOUtils;
import javax.servlet.SingleThreadModel;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.HttpMethod;
import java.io.*;
import java.net.URLEncoder;
@WebServlet(name = "PublicDownloader" ,value = "/public/download")
public class PublicDownloader extends HttpServlet implements SingleThreadModel {
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
InputStream is = null;
try {
User owner = (User) resultItem.getData();
OSWorker osWorker = new OSWorker(owner.getMount());
ItemPath publicSource = new ItemPath(owner, publicShare.getLocalPath());
if (osWorker.exists(publicSource).isSuccess()) {
resultItem = osWorker.getFile(publicSource);
if (resultItem.isSuccess()) {
FileItem outfile = (FileItem) resultItem.getData();
String mimeType = outfile.getContenttype().getMimeType();
String displayName = URLEncoder.encode(new String(outfile.getItemPath().getFileName().getBytes("UTF-8")), "UTF-8");
if (request.getMethod().equals(HttpMethod.HEAD)) {
response.setContentType(outfile.getContenttype().getMimeType());
response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(outfile.getLength()));
response.setHeader("Display-Name", URLEncoder.encode(new String(outfile.getItemPath().getFileName().getBytes("UTF-8")), "UTF-8"));
response.setHeader(HttpHeaders.LAST_MODIFIED, outfile.getLastmodified().toString());
response.setStatus(200);
return;
} else {
response.setContentType(outfile.getContenttype().getMimeType());
if (!preview)
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(new String(outfile.getItemPath().getFileName().getBytes("UTF-8")), "UTF-8"));
is = osWorker.getContent(publicSource);
response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(outfile.getLength()));
if (is != null) {
OutputStream os = response.getOutputStream();
long readed = org.apache.commons.io.IOUtils.copyLarge(is, os);
response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(readed));
os.flush();
FileUtils.close(is);
FileUtils.close(os);
response.setStatus(200);
return;
}else {
response.setStatus(501);
return;
}
}
}else {
response.setStatus(500);
return;
}
} else {
response.setStatus(404);
return;
}
} catch (IOException io) {
if (io.getMessage().contains("An existing connection was forcibly closed by the remote host")) {
} else if (io.getMessage().contains("An established connection was aborted by the software in your host machine")) {
} else if (io.getMessage().contains("Connection reset by peer")) {
} else if (io.getMessage().contains("Broken pipe")) {
} else {
FileUtils.close(is);
Log.errorLog(io);
}
response.setStatus(500);
return;
} catch (Exception ex) {
Log.errorLog(ex);
response.setStatus(500);
return;
}
}
}