Files.createDirectories(filePath.getParent());报错空指针异常;另外下载要通过浏览器自定义下载路径,而不是直接下载到目录里
时间: 2024-10-10 18:17:26 浏览: 31
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
关于`Files.createDirectories(filePath.getParent())`抛出空指针异常的情况,这通常发生在`filePath`为null或者其父路径不存在时。确保你在调用这个方法之前已经正确地解析了URL并得到了有效的`filePath`。如果URL有问题,例如格式错误或者网络连接失败,可能会导致`filePath`为null。
至于让你自定义下载路径,你需要在创建`responseOutputStream`时指定一个可以写入临时文件的位置,而不是直接保存到磁盘上。在浏览器中,用户通常需要手动选择下载位置,所以我们不会直接下载到指定的目录里。这里是一个修改后的版本,用于创建一个临时文件供下载:
```java
import java.io.*;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class DownloadAndSaveAs {
public static void downloadFileFromUrl(String urlString, String zipFileName) throws IOException {
URL url = new URL(urlString);
try (InputStream in = url.openStream();
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(responseOutputStream(zipFileName))) ) {
byte[] buffer = new byte[4096];
int bytesRead;
// 获取文件名
String fileName = extractFileNameFromUrl(url);
ZipEntry entry = new ZipEntry(fileName);
out.putNextEntry(entry);
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
out.closeEntry();
// 将压缩包写入到内存,并设置Content-Disposition头来触发浏览器下载
byte[] compressedData = out.toByteArray();
saveToTempFile(zipFileName, compressedData);
setResponseForDownload(zipFileName);
}
}
private static void saveToTempFile(String zipFileName, byte[] data) {
try {
File tempFile = File.createTempFile(zipFileName, ".zip");
Files.write(tempFile.toPath(), data);
} catch (IOException e) {
throw new RuntimeException("Failed to create temporary file for download", e);
}
}
private static void setResponseForDownload(String fileName) {
try (HttpURLConnection connection = (HttpURLConnection) new URL("file:" + tempFile.getAbsolutePath()).openConnection()) {
connection.setRequestProperty("Content-Type", "application/octet-stream");
connection.setRequestProperty("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
} catch (IOException e) {
throw new RuntimeException("Failed to set up HTTP response for download", e);
}
}
private static String extractFileNameFromUrl(URL url) {
// ... (提取文件名的方法)
}
}
```
在这个版本中,我们首先将压缩的数据保存到一个临时文件中,然后创建一个HTTP连接并将响应设置为指向这个临时文件,这样浏览器就会提示用户下载。
阅读全文