我正在研究一个项目,要求我在点击按钮后从URL下载pdf文件,并将其存储到手机存储中(可能是downloads文件夹)。
有关如何执行此操作的任何想法?下载的文件也不总是相同,可以是pdf到图像的任何形式。
答案 0 :(得分:2)
您可以使用Dio软件包通过Dio().download
response = await dio.download("https://www.google.com/", "./xx.html");
您还可以查看此open source project作为参考
答案 1 :(得分:0)
我希望这会对您有所帮助。检查文件是否已经存在,如果没有,则使用URL提取文件并将其保存在应用程序目录中。
Future<File> createFile() async {
try {
/// setting filename
final filename = widget.docPath;
/// getting application doc directory's path in dir variable
String dir = (await getApplicationDocumentsDirectory()).path;
/// if `filename` File exists in local system then return that file.
/// This is the fastest among all.
if (await File('$dir/$filename').exists()) return File('$dir/$filename');
///if file not present in local system then fetch it from server
String url = widget.documentUrl;
/// requesting http to get url
var request = await HttpClient().getUrl(Uri.parse(url));
/// closing request and getting response
var response = await request.close();
/// getting response data in bytes
var bytes = await consolidateHttpClientResponseBytes(response);
/// generating a local system file with name as 'filename' and path as '$dir/$filename'
File file = new File('$dir/$filename');
/// writing bytes data of response in the file.
await file.writeAsBytes(bytes);
/// returning file.
return file;
}
/// on catching Exception return null
catch (err) {
errorMessage = "Error";
print(errorMessage);
print(err);
return null;
}
}
答案 2 :(得分:0)
以下代码适用于 iOS 和 Android。如果您要下载图片,请将“.pdf”替换为“.jpg”。
在 pubspec.yaml
中,将以下代码粘贴到依赖项下
dio: any
path_provider: any
file_utils: any
permission_handler: any
在 android/app/src/main/AndroidManifest.xml
中,将以下几行粘贴到 <application>
标签之外
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
代码如下:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:async';
import 'package:file_utils/file_utils.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:intl/intl.dart';
void main() => runApp(Downloader());
class Downloader extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp(
title: "File Downloader",
debugShowCheckedModeBanner: false,
home: FileDownloader(),
theme: ThemeData(primarySwatch: Colors.blue),
);
}
class FileDownloader extends StatefulWidget {
@override
_FileDownloaderState createState() => _FileDownloaderState();
}
class _FileDownloaderState extends State<FileDownloader> {
final pdfUrl = "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf";
bool downloading = false;
var progress = "";
var path = "No Data";
var platformVersion = "Unknown";
var _onPressed;
Directory externalDir;
@override
void initState() {
super.initState();
downloadFile();
}
String convertCurrentDateTimeToString() {
String formattedDateTime =
DateFormat('yyyyMMdd_kkmmss').format(DateTime.now()).toString();
return formattedDateTime;
}
Future<void> downloadFile() async {
Dio dio = Dio();
final status = await Permission.storage.request();
if (status.isGranted) {
String dirloc = "";
if (Platform.isAndroid) {
dirloc = "/sdcard/download/";
} else {
dirloc = (await getApplicationDocumentsDirectory()).path;
}
try {
FileUtils.mkdir([dirloc]);
await dio.download(pdfUrl, dirloc + convertCurrentDateTimeToString() + ".pdf",
onReceiveProgress: (receivedBytes, totalBytes) {
print('here 1');
setState(() {
downloading = true;
progress = ((receivedBytes / totalBytes) * 100).toStringAsFixed(0) + "%";
print(progress);
});
print('here 2');
});
} catch (e) {
print('catch catch catch');
print(e);
}
setState(() {
downloading = false;
progress = "Download Completed.";
path = dirloc + convertCurrentDateTimeToString() + ".pdf";
});
print(path);
print('here give alert-->completed');
} else {
setState(() {
progress = "Permission Denied!";
_onPressed = () {
downloadFile();
};
});
}
}
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text('File Downloader'),
),
body: Center(
child: downloading
? Container(
height: 120.0,
width: 200.0,
child: Card(
color: Colors.black,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircularProgressIndicator(),
SizedBox(
height: 10.0,
),
Text(
'Downloading File: $progress',
style: TextStyle(color: Colors.white),
),
],
),
),
)
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(path),
MaterialButton(
child: Text('Request Permission Again.'),
onPressed: _onPressed,
disabledColor: Colors.blueGrey,
color: Colors.pink,
textColor: Colors.white,
height: 40.0,
minWidth: 100.0,
),
],
)));
}